【问题标题】:C++ Copy Constructor ErrorC++ 复制构造函数错误
【发布时间】:2023-04-01 13:06:02
【问题描述】:

假设我有以下代码:

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,int u, int v, int w) 的那个不是复制 ctor。正在调用默认复制 ctor。
  • @Sam Varshavchik 我运行了代码,没有调用复制构造函数

标签: c++ class oop constructor


【解决方案1】:

您的第二个构造函数不是复制构造函数。构造函数只有在可以使用单个参数调用时才是复制构造函数,该参数是要从中复制的对象。

为什么不:

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

注意

  1. 此复制构造函数实际上与编译器相同 生成了一个。
  2. 不要static_cast(我把它放进去 清晰度)。

【讨论】:

  • 谢谢你,马丁。
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多