c++复制构造函数错误

C++ Copy Constructor Error

本文关键字:错误 构造函数 复制 c++      更新时间:2023-10-16

假设我有以下一段代码:

class C1{
int x, y;
public:
    C1(int a, int b):x(a),y(b)
    {
        cout<<"const normal C1"<<endl;
    }
};
class C2 : protected C1
{
    int x, y;
    const int z;
public:
    C2(int u, int v, int w):C1(u,v),z(w)
    {
        cout<<"constr normal C2"<<endl;
    }
    C2(const C2 &a,int u, int v, int w):C1(u,v),z(w)
    {
        cout<<"cpy constr C2"<<endl;
    }
};
int main(){
C2 a(2,3,4);
C2 b=a;
}

当我创建对象b时,应该调用复制构造函数而不是普通构造函数,但事实并非如此。现在我知道复制构造函数应该像

C (C const&obj){…}

,其中C是一个类,但在这种情况下,我需要C1的构造函数的其他参数。现在,我的问题是,我做错了什么,或者我该怎么做才能使复制构造函数正常工作?

第二个构造函数不是复制构造函数。只有当构造函数可以用一个实参(复制对象)调用时,它才是复制构造函数。

为什么不:

C2(const C2 &a):C1(static_cast<const C1&>(a)), z(a.z)
{
    cout<<"cpy constr C2"<<endl;
}

注意

  1. 这个复制构造函数实际上与编译器相同生成一个。
  2. static_cast是不必要的(我把它放在清晰)。