#include <iostream>
using namespace std;
class myclass {
public:
myclass();
myclass(const myclass &o);
myclass f();
};
myclass:: myclass(){
cout<<"Constructing normally"<<endl;
};
myclass:: myclass(const myclass &o){
cout<<"Constructing copy"<<endl;
};
myclass myclass::f(){
myclass temp;
return temp;
};
int main(){
myclass obj;
obj = obj.f();
return 0;
}
我在一本书中找到了这个例子,它表明程序的输出应该是:
Constructing normally
Constructing normally
Constructing copy
但是当我在我的编译器中编译它时它只显示下面写的输出
Constructing normally
Constructing normally
里面到底发生了什么?
最佳答案
您的构造函数有一个副作用 - 即 cout
调用。所以编译器不能优化掉 obj = obj.f();
中的拷贝。
但是 C++ 标准确实允许它优化掉接收到的深拷贝
myclass myclass::f(){
myclass temp;
return temp;
};
尽管有副作用。这种允许的策略称为命名返回值优化。
遗憾的是,您的书确实已经过时,或者从一开始就与事实不符!在这个即将到来的冬天,您可以用它来点燃那些舒适的火苗。
关于c++ - 复制构造函数何时开始工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39661522/