我理解当从现有对象创建对象时以及函数按值返回对象时,将调用复制构造函数。那么为什么在下面的代码中没有调用复制构造函数,而是默认的构造函数?
class A {
public:
A() { cout << "A" << endl; }
A(A &) { cout << "A&" << endl; }
A(const A &) { cout << "const A&" << endl; }
};
A fun() {
class A a;
return a;
}
int main() {
class A a = fun(); // output: A
}
答案 0 :(得分:3)
简答:编译器优化。
首先,函数中的a
对象直接在main
函数的范围内创建,以避免必须复制(或在C ++ 11中移动)本地参数通过函数返回超出函数范围。这是返回值优化。
然后,在main中,语句变得等同于class A a = A()
,并且允许编译器在适当的位置创建a
对象,而无需从临时对象进行复制。这是 copy elision 。
即使复制构造函数(完全被绕过)具有副作用,也允许这样做,如您的示例所示。