gpt4 book ai didi

C++ 复制构造函数对成员初始化的双重调用

转载 作者:行者123 更新时间:2023-11-30 01:38:39 25 4
gpt4 key购买 nike

考虑下面的代码,其中正在实例化一个以另一个类作为其成员的组合类:

class CopyAble {
private:
int mem1;
public:
CopyAble(int n1) : mem1(n1) {
cout << "Inside the CopyAble constructor" << endl;
}
CopyAble(const CopyAble& obj) {
cout << "Inside the CopyAble copy constructor" << endl;
this->mem1 = obj.mem1;
return *this;
}

CopyAble& operator=(const CopyAble& obj) {
cout << "Inside the CopyAble assignment constructor" << endl;
this->mem1 = obj.mem1;
}
~CopyAble() {};
};

class CopyAbleComposer {
private:
CopyAble memObj;
public:
CopyAbleComposer(CopyAble m1) : memObj(m1) {
cout << "Composing the composer" << endl;
}
~CopyAbleComposer() {}
};

int main()
{
CopyAble ca(10);
CopyAbleComposer cac(ca);
return 0;
}

当我运行它时,我得到了输出:

Inside the CopyAble constructor  
Inside the CopyAble copy constructor
Inside the CopyAble copy constructor
Composing the composer

这意味着 CopyAble 复制构造函数正在运行两次 - 一次是在 CopyAble 对象被传递到 CopyAbleComposer 构造函数时,另一次是在初始化程序 memObj(m1) 运行时。

这是复制构造函数的惯用用法吗?当我们尝试使用相同类型的传入对象初始化成员对象时,复制构造函数运行两次似乎非常低效,而且这似乎是很多 C++ 程序员很容易陷入的陷阱而没有意识到。

编辑:我不认为这是关于将引用传递给复制构造函数的问题的重复。在这里,我们被迫将引用传递给常规构造函数以避免创建重复对象,我的问题是 C++ 中的类构造函数应该通过引用传递对象以避免这种重复复制,这是众所周知的吗?

最佳答案

您应该在 CopyAbleComposer(CopyAble m1) 处通过引用接受 CopyAble,否则将调用复制构造函数来构造参数。您还应该将其标记为 explicit 以避免意外调用:

explicit CopyAbleComposer(const CopyAble & m1)

关于C++ 复制构造函数对成员初始化的双重调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47269318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com