![](/img/trans.png)
[英]why the copy constructor is called twice when the object is contained in another object in c++?
[英]When is a copy constructor called in c++, is not it called when I assign a object to another object?
class Myinteger(){
public:
Myinteger( int len ); // simple constructor
Myinteger( const Myinteger &obj); // copy constructor
~Myinteger(); // destructor
private:
int *ptr;
}
Myinteger::Myinteger(const Myinteger &obj) {
cout << "Copy constructor allocating ptr." << endl;
ptr = new int;
*ptr = *obj.ptr; // copy the value
}
int main(){
Myinteger obj1(10);
Myinteger obj2(20);
obj1=obj2;
return 0;
}
将obj2分配给obj1时,不会调用复制构造函数,因为“复制构造函数分配ptr”,所以我确认了这一点。 没有打印到控制台,
因此,如果在将obj2分配给obj1的情况下,如果未调用复制构造函数,则在上述情况下将调用哪个方法,还应说明在哪种情况下调用了类的复制构造函数。
复制构造函数,例如将这样声明:
Myinteger(const Myinteger& other);
将用作
Myinteger obj2 = obj1;
要么
Myinteger obj2(obj1);
但是一个赋值运算符,声明为:
Myinteger& operator =(const Myinteger& other);
将用于您的代码有
Myinteger obj2;
obj2 = obj1;
这就是代码中的内容,因此将调用赋值运算符,而不是复制构造函数。
在此声明中
obj1=obj2;
使用复制赋值运算符是因为赋值的两个操作数(对象)均已创建。 因此,如果已经创建它们,则不会调用任何构造函数。
如果要使用复制构造函数,则可以编写例如
int main()
{
Myinteger obj1( "10" );
Myinteger obj2 = obj1;
return 0;
}
我得到了答案,我以为只要我们将一个对象分配给另一个在概念上是错误的对象,就会调用复制构造函数。 仅当创建对象时才调用copy构造函数,如果我们将对象分配给已存在的对象,则将调用重载的赋值运算符函数,否则从类中调用默认的赋值运算符函数。
我得到了答案,我以为每当我们将一个对象分配给另一个在概念上是错误的对象时,就会调用复制构造函数。 仅当创建对象时才调用copy构造函数,如果我们将对象分配给已存在的对象,则将调用重载的赋值运算符函数,否则从类中调用默认的赋值运算符函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.