当我添加另一个对象作为复制构造函数中的参数时,为什么调用复制构造函数?

时间:2019-07-05 09:19:51

标签: c++ c++11 copy-constructor

我不明白为什么在将e添加到c时为什么调用了复制构造函数。

struct A {};
struct B {
    B() { std :: cout << "B Constructor" << std :: endl; }
    B(const A&) { std :: cout << "B Copy" << std :: endl;}
    const B operator +(const B& arg);
};

const B B::operator +(const B& arg) {
    std :: cout << "+" << std :: endl;
    return B();
}

int main() {
    B c;
    A e;
    c + e;
}

1 个答案:

答案 0 :(得分:2)

不是要调用副本构造函数,而是

B(const A&);

复制构造函数始终具有这样的签名:

B(const B&);

由于您没有提供,编译器会为您生成一个副本构造函数,但实际上并没有调用它:您有一个operator+的{​​{1}},它接受​​一个{{1} },但另一个操作数的类型为B。由于首先提到的构造函数(const B&隐式,所以可以解决-从名为A的{​​{1}}对象实例化一个临时B(const A&),并调用运算符。

要使示例中的输出更加直观,请考虑将构造函数B更改为

A
相关问题