复制构造函数中的初始化列表

时间:2013-12-30 18:43:33

标签: c++ struct

#include <iostream>
using namespace std;

struct A{
    A(){}
    A(const A&) {cout<<"1";}
};

struct B: A{
    B(){}
    B(const B&){}
};

struct C: A{
    C(){}
    C(const B&rhs):A(rhs){} 
};

struct D:A{
    D(){}
};

int main(){
    D d;
    D dcopy(d);
    C c;
    C ccopy(c);
    B b;
    B bcopy(b);
    }

当我运行这个程序时,我预期输出为:111,但输出为:11,请解释!!!

C(const B& rhs) : A(rhs) {}  // presence of this line has no influence on output,
                             // please explain, why?

2 个答案:

答案 0 :(得分:2)

B(const B&){}

此代码不输出任何内容,也不复制构造A(默认构造它)。所以B bcopy(b)不会输出任何内容。也许你的意思是:

B(const B& rhs) : A(rhs) {}

答案 1 :(得分:0)

根据C ++标准

  

8在非委托构造函数中,如果是给定的非静态数据成员   或者基类不是由mem-initializer-id指定的(包括   因为构造函数没有mem-initializer-list的情况   没有ctor-initializer)并且实体不是虚拟基类   一个抽象类(10.4),然后......

     

- 否则,实体默认初始化(8.5)。

  

15非联合类的隐式定义的复制/移动构造函数   X执行其基础和成员的成员复制/移动。

因此,在您的示例中,类D隐式定义了复制构造函数,并根据第二个引用执行其基类的复制,即它调用A的复制构造函数。

同样适用于C类(C没有明确的用户定义的复制构造函数,因此编译器定义了一个隐式复制构造函数。这个定义C(const B&amp; rhs):A(rhs){}不是定义复制构造函数。它是一个带有一个参数的构造函数。)

B类没有隐式定义的复制构造函数。它有一个用户定义的复制构造函数。因此,根据第一个引用,它执行其子对象的默认初始化,它调用类A的默认构造函数。