加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 当复制构造函数开始工作时?

发布时间:2020-12-16 10:13:23 所属栏目:百科 来源:网络整理
导读:#include iostreamusing 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
#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;
};

尽管有副作用.这种允许的策略称为命名返回值优化.

可悲的是,你的书从一开始就非常过时,或者事实上是不正确的!在即将到来的冬天照亮那些舒适的火焰时,你可以用它来点燃它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读