#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
里面究竟发生了什么?
答案 0 :(得分:11)
您的构造函数具有副作用 - 即obj = obj.f();
调用。因此,编译器无法优化myclass myclass::f(){
myclass temp;
return temp;
};
中的副本。
但是C ++标准确实允许它优化
中的深层拷贝{{1}}
尽管有副作用。该允许策略称为命名返回值优化。
可悲的是,你的书从一开始就非常过时,或者事实上是不正确的!在即将到来的冬天点燃那些舒适的火焰时,你可以用它来点燃。
答案 1 :(得分:0)
#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;
}