【问题标题】:Why does default copy consructor not invoking when a parameter is sent by value?为什么按值发送参数时默认复制构造函数不调用?
【发布时间】:2020-07-06 03:45:45
【问题描述】:

此程序初始化一个类的对象并将其作为参数传递给另一个成员函数。 当我发表声明时

Address a2=a1;

它没有显示错误。但是当我将参数作为对象时

Employee(int id, string name, Address address);

并使用它调用它

Employee e1 = Employee(101,"Nakul",a2);

它显示以下错误。

#include <iostream>  
using namespace std;  
class Address {  
    public:  
     string addressLine, city, state;    
     Address(string addressLine, string city, string state)    
     {    
        this->addressLine = addressLine;    
        this->city = city;    
        this->state = state;    
     }
    
};  
class Employee    
{    
     private:  
     Address address;  //Employee HAS-A Address   
     public:  
     int id;    
     string name;    
     Employee(int id, string name, Address address)    //Here it is showing an error
     {    
           this->id = id;    
           this->name = name;    
           this->address = address;    
     }    
     void display()    
     {    
           cout<<id <<" "<<name<< " "<<     
             address.addressLine<< " "<< address.city<< " "<<address.state<<endl;    
     }    
};   
int main(void) {  
    Address a1= Address("C-146, Sec-15","Noida","UP");    
    Address a2=a1; //Here it is showing no error.
    Employee e1 = Employee(101,"Nakul",a2);
            e1.display();   
   return 0;  
}  

错误是

error: no matching function for call to ‘Address::Address()’
        {
        ^

【问题讨论】:

  • 您实际上并没有使用address 参数来初始化this-&gt;address 成员。赋值不是初始化。在您最喜欢的 C++ 教科书中阅读构造函数初始化器列表。

标签: c++ oop constructor


【解决方案1】:

在Employee的构造函数中,成员address没有在成员初始化列表中提及。然后它将首先默认初始化,然后在Employee 的构造函数主体中分配为this-&gt;address = address;。但是Address 没有默认构造函数。

可以在member initializer list中初始化为

Employee(int id, string name, Address address) : address(address)
//                                               copy-initialize (via copy constructor)
{    
    this->id = id;    
    this->name = name;    
}    

然后address通过复制构造函数从构造函数参数复制初始化。

【讨论】:

  • 所以在调用复制构造函数之前,Employee 的构造函数调用了 Address 的默认构造函数。
  • @PariRaju this-&gt;address = address; 是分配。所以首先address 是默认初始化的,然后由this-&gt;address = address; 在构造函数主体中分配。复制构造函数不会在这里起作用。如果在成员初始化器列表中初始化,则使用复制构造函数初始化address,而不是默认初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2017-07-28
  • 2020-04-11
  • 2021-12-12
  • 2016-03-25
相关资源
最近更新 更多