用C ++复制构造函数

时间:2012-02-10 13:56:00

标签: c++ constructor copy-constructor

我有这些课程:

首先:

 class C 
 {
     public:
     C(const C& c):_s(c._s){}
     c():_s(""){}

     string _s;
 }

第二

class C2: public C
{
    public:
    C2(const C2 & c2):_i(c2.i){}
    C2():_i(0){}

    int _i;
}

主:

int main()
{
    C2 c2;
    C2._s="hello";
    c2._i=42;
    C2 c3(c2);
    cout<<c3._s<<" "<<c3._i<<endl;
}

,输出为42.我的问题是,为什么输出42?始终在派生构造函数之前调用基础构造函数,因此这一行:

C2 c3(c2);

应该调用C的拷贝构造函数,并且应该复制“hello”,这意味着输出应该是hello。我在这里错过了什么?

4 个答案:

答案 0 :(得分:4)

原因是

C2(const C2 & c2):_i(c2.i){}

不会将_s初始化为c2中存储的值,因为除非另有说明,否则将调用基类的默认(无参数)构造函数,因此_s也会使用其默认值进行初始化构造函数,而不是复制构造函数。

特别是在您的情况下C2::(const C2&)调用C::C()并调用string::string()

您必须显式调用正确的基础构造函数:

C2(const C2 & c2) :
  C( c2 ),
  _i(c2.i)
{
}

答案 1 :(得分:1)

除了拼写错误(字符串s-&gt;字符串_s)之外,派生类的复制构造函数应该调用基类的构造函数

C2(const C2 & c2):C(c2), _i(c2.i){} 

顺便说一句 - 与变量类型名称相似的

,问题会更容易

答案 2 :(得分:1)

调用对象的复制构造函数。默认(编译器 生成)复制构造函数为每个成员调用复制构造函数, 然后是每个基类的复制构造函数。复制构造函数 你写的完全是你写的,不多也不少。大多数 时间,用户定义的复制构造函数应该从副本开始 建立基地:

C2::C2( C2 const& other )
    : C( other )
    , _i( other._i )
{
}

然而,有一些例外,有些时候你不想要 复制基地。

答案 3 :(得分:0)

是的,在派生类之前调用​​基类,调用WHICH基类构造函数但是由派生类规范决定。