复制成员对象的构造函数调用

时间:2012-02-18 07:53:00

标签: c++

C ++表示,要为使用合成的类创建复制构造函数,编译器会递归调用所有成员对象的复制构造函数。我在下面的代码中尝试了同样的事情:

class A
{
public:
    A(){cout<<"A constructor called"<<endl;}
    A(const A&){cout<<"A copy constructor called"<<endl;}
};

class B
{
public:
    B(){cout<<"B constructor called"<<endl;}
    B(const B&){cout<<"B copy constructor called"<<endl;}
};

class C
{
    A a;
    B b;
public:
    C(){cout<<"C constructor called"<<endl;}
    C(const C&){cout<<"C copy constructor called"<<endl;}// If you comment this line, you will get output: Case 1 (see below)     and if you don't comment, you will get o/p: case 2(see below)
};


void main()
{
    C c;
    cout<<endl;
    C c2 = c;
}`

案例1:

  

一个名为

的构造函数      

B构造函数名为

     

C构造函数名为

     

名为

的复制构造函数      

B复制构造函数叫

案例2:

  

一个名为

的构造函数      

B构造函数名为

     

C构造函数名为

     

一个名为

的构造函数      

B构造函数名为

     

C拷贝构造函数叫

我怀疑的是案例2的o / p应该是:A,B,C,构造函数调用然后...... A,B,C复制构造函数调用。但它没有发生。请帮忙。

3 个答案:

答案 0 :(得分:9)

发生,除了您为C提供了自己的复制构造函数,它告诉编译器“不提供默认的复制构造函数。”

如果您希望复制构造函数执行与隐式定义的复制构造函数相同的操作(以及额外的打印),则需要按如下方式定义它:

C(const C& other)
    : a(other.a), b(other.b)
{
    std::cout << "C copy constructor called" << std::endl;
}

答案 1 :(得分:4)

该标准仅解释默认复制构造函数的行为。当您注释掉为C编写的复制构造函数时,默认的复制构造函数是您正在使用的构造函数。如果您编写自己的复制构造函数,则必须明确复制要复制的任何成员,如下所示:

C( const C& c ) : a(c.a), b(c.b) {cout<<"C copy constructor called"<<endl;}

显然编写自己的拷贝构造函数有点容易出错,因此最好尽可能依赖于默认值。

答案 2 :(得分:1)

在这两种情况下,都会调用C::C( C const &)复制构造函数。当它是隐式的时,它会调用基类的复制构造函数。当它以明确的方式定义时,它会调用AB的默认构造函数。这是预期的行为。请注意,C c2 = c;等于C c2(c);,没有临时值。