c++ - 难道拷贝构造函数不能调用另一个拷贝构造函数?
问题描述
class Hello
{
private:
int world;
public:
Hello()
{
}
Hello(const Hello& other)
{
world = other.world;
}
};
int main()
{
Hello a;
Hello b = a;
Hello c = Hello(a); //not Hello c(a);
return 0;
}
我猜它只会在Hello b = a;
. 并且Hello c = Hello(a);
将调用复制构造函数 2 次。
(1)Hello(a);
将调用复制构造函数并制作一个临时的 Hello 对象。(2)Hello c = temporary object;
将为 c 对象调用复制构造函数。
以上是我对复制构造函数为什么会调用两次的猜测Hello c = Hello(a);
我调试了它,但结果显示 Hello b = a; 和你好 c = 你好(a);在 Visual Studio 2015 中完全一样。我没有像 Hello c(a) 那样调用;
这是调用复制构造函数的另一种显式表达式吗?难道拷贝构造函数不能调用另一个拷贝构造函数?
解决方案
在以下情况下,编译器需要省略类 [...] 的复制 [...] 构造:
- 在对象的初始化中,当初始化表达式是与变量类型相同的类类型(忽略 cv-qualification)的纯右值时:
Tx = T(T(f())); // 只调用一次 T 的默认构造函数,初始化 x
编码:
Hello c = Hello(a);
正在将 object 初始化c
为Hello
来自 type prvalue 的类型Hello
。复制省略已(并且必须)执行,因此不调用复制构造函数(因为调用了=
- 复制构造函数Hello(a)
)。
难道拷贝构造函数不能调用另一个拷贝构造函数?
嗯,当然可以。
Hello(const Hello& other) {
Hello tmp = Hello(other);
*this = tmp; // endless recursive function
}
推荐阅读
- django - 使用额外参数创建通用视图装饰器
- azure - 使用 Azure 数据工厂 v2 中启用的 polybase 将空十进制值传输到 Azure 数据仓库时出错
- javascript - 尝试从不同的功能显示时,PopupDialog 不起作用
- javascript - 如何在 Node 和 HTML 中使用配置文件?
- node.js - NodeJS request.get 正文
- .net - 如何在 msbuild 15.0 命令行中指定私有 nuget 包源?
- javascript - 如果 React Native 以最高 60fps 运行,如何更快地处理事件
- android - 使用 Android 相机应用程序以与启动时不同的方向拍照后应用程序崩溃
- java - 休眠 - 多对一关联,无法加载实体
- c++ - 当我在 C++ 中使用 OpenMp 的折叠时出错