C ++ Copy Constructor调用

时间:2011-03-18 03:04:37

标签: c++ copy-constructor

快速提问。如果我有一个数组并且正确地重载了​​赋值运算符,那么当我做这样的事情时:

A = B 

当A和B都是数组类型的对象时,我是调用复制构造函数,还是只调用重载赋值运算符(=)?

我知道在

时会调用复制构造函数
  1. 传递值
  2. 返回类类型的值
  3. 当一个对象被括号中给出的另一个相同类型的对象声明和初始化时。
  4. 上面的<3>让我感到困惑,并认为A = B也在调用复制构造函数。

    它只是调用重载的赋值运算符吗?

    谢谢!

5 个答案:

答案 0 :(得分:3)

以上都不是:你不能分配数组。


如果你有自己的数组类,它有类似的东西:

struct arr
{
    arr& operator=(const arr& other)
    {
        // ...
    }
};

arr a, b;

然后这些是等价的:

a = b;
a.operator=(b);

就像调用一个函数一样。

答案 1 :(得分:1)

既然你已经说过数组是你自己的一个带有重载赋值运算符的类,那么你已经回答了自己的问题。

复制构造函数实际上只在从另一个构造对象时调用:

Obj a; Obj b(a);

如果你这样做,可能会被某种编译器魔法调用:

Obj a; Obj b = a;

但我从来没有费心去实际看那个。

如果你只是做a = b你没有构建一个,那么你就不会调用复制构造函数。

有意义吗?

答案 2 :(得分:0)

如果执行了A=B;

,则会调用重载的赋值运算符
class userDefinedArray
{
    int size ;
    int* ptr;

    public:
    userDefinedArray( int size ) :   size(size)
                                   , ptr( new int[size] )
    {}
    // The Big Three = 1. Copy Constructor 2. Assignment Operator 3. Destructor
};

如果上面是类定义,则应调用赋值运算符。

答案 3 :(得分:0)

复制构造函数被称为-as you-when

  1. 传递值
  2. 返回类类型的值
  3. 当一个对象被括号中指定的另一个相同类型的对象声明和初始化时,
  4. 考虑以下代码的输出:

    #include <iostream>
    
    using std::cout;
    
    class Test
    {
    public:
        Test()
        {
        }
        Test(const Test& T)
        {
            cout << "Calling Copy Constructor";
        }
    };
    
    void PassingValue(Test T)
    {
        cout << " while Passing parameter by value\n\n";
    }
    
    void PassingReference(Test &T)
    {
        cout << "NOT CALLING copy constructor while Passsing Parameter by reference\n\n";
    }
    
    int main()
    {
        Test One;
        // case 1 :
        cout << "case 1 : \n";
        Test Two(One);
        cout << " while creating Two as a copy of One\n\n";
        // case 2 :
        cout << "case 2 : \n";
        PassingValue(One);
        // case 3 :
        cout << "case 3 : \n";
        Test Three = Two;
        cout << " while assigning initial value\n\n";
        // case 4 :
        cout << "case 4 : \n";
        PassingReference(Two);
        // case 5
        cout << "case 5 : \n";
        Test Four;
        Four = Three;
        cout << "NOT CALLING copy constructor while assigning normally\n\n";
        return 0;
    }
    

答案 4 :(得分:0)

  上面的<3>让我感到困惑,并认为A = B也在调用复制构造函数。

除非您的复制构造函数声明为explicit,否则以下内容确实会调用复制构造函数:

MyType A = B; // will call copy ctor

我相信标准保证这个(我没有我的参考方便)所以你知道你不会调用默认的ctor,然后是赋值运算符。