复制构造函数何时开始工作?

时间:2016-09-23 13:04:56

标签: c++

#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

里面究竟发生了什么?

2 个答案:

答案 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;
}