繁体   English   中英

什么时候在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM