2016-09-23 41 views
3
#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

这意味着你的编译器优化了复制离开第二行'OBJ = obj.f();' – EdChum

+0

我无法得到它:(你能请详细说明它 – IAmBlake

+0

阅读返回值。?优化和复制elision(你的书可能是旧的)。 –

回答

11

您的构造函数有一个副作用 - 即cout调用。所以编译器不能优化出obj = obj.f();中的副本。

但是C++标准确实允许它优化了所采取的深层副本在

myclass myclass::f(){ 
    myclass temp; 
    return temp; 
}; 

尽管有作为一个副作用。该允许策略称为命名返回值优化

可悲的是,你的书真的很过时,或者事实上从一开始就不正确!在即将到来的冬季点燃这些温馨的火焰时,您可以使用它进行点燃。

+0

阳光,你说!? –

+0

@GillBates:Ha。我不得不回到办公室。现在我正在编译一些东西。 – Bathsheba

+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; 
} 
+0

试试这个会给出输出:正常构造和构造copy –