首页 > 解决方案 > 难道拷贝构造函数不能调用另一个拷贝构造函数?

问题描述

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) 那样调用;

这是调用复制构造函数的另一种显式表达式吗?难道拷贝构造函数不能调用另一个拷贝构造函数?

标签: c++

解决方案


cppreference 复制省略

在以下情况下,编译器需要省略类 [...] 的复制 [...] 构造:

  • 在对象的初始化中,当初始化表达式是与变量类型相同的类类型(忽略 cv-qualification)的纯右值时:

Tx = T(T(f())); // 只调用一次 T 的默认构造函数,初始化 x

编码:

Hello c = Hello(a);

正在将 object 初始化cHello来自 type prvalue 的类型Hello。复制省略已(并且必须)执行,因此不调用复制构造函数(因为调用了=- 复制构造函数Hello(a))。

难道拷贝构造函数不能调用另一个拷贝构造函数?

嗯,当然可以。

Hello(const Hello& other) {
    Hello tmp = Hello(other);
    *this = tmp; // endless recursive function
}

推荐阅读