比较奇怪的写法,居然编过了

Master Cui 2020-06-14 06:46:14

class A
{
public:
explicit A(int a):mem(a) {cout<<"a constructor"<<mem<<endl;}
A():mem(0){cout<<__func__<<endl;}
A(const A &t) {cout<<"copy"<<endl;}
A operator=(const A &t) {cout<<__func__<<endl;}
~A() {}
A add(const A &one, const A & two);
int mem;
};

A A::add(const A &one, const A & two)
{
cout<<__func__<<endl;
A tmp;
tmp.mem=one.mem+two.mem;
return tmp;
}

int main(int argc, char const *argv[])
{
A res2=res2.add(A(10), A(20));
cout<<res2.mem<<endl;
return 0;
}


想问一下第23行代码,在初始化res2时,为啥会啥也没调用(构造函数,拷贝构造,赋值都没),这行代码执行时,背后的原理是咋样的
...全文
210 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tobybo 2020-06-15
  • 打赏
  • 举报
回复 1
编译器关闭优化的时候: 看编译器调用顺序,add调之后才调的 A() 这个无参构造函数,然后调用一次拷贝构造函数返回给右边的函数调用,再调用一次拷贝构造给res2,由于你的拷贝构造只是打印了下copy,并没有赋值操作, 所以mem就是 调用 A()时初始化的0; 开启优化的时候: 前一个截图编译器优化的时候把后面两步copy省了,就直接用了add返回的对象,所以输出30; ----------------- 至于这个能编译通过, 大概是因为编译器 创建一个对象 和 调用对象的构造函数是单独的两条语句。
Master Cui 2020-06-15
  • 打赏
  • 举报
回复
引用 3 楼 Master Cui 的回复:
[quote=引用 2 楼 真相重于对错 的回复:] 1、调用构造函数了。。。。 2、你传递的是两个临时变量给add,那个函数的参数是两个const T& 所以不会发生拷贝,以及复制 3、T a=临时变量的方式会引起复制消除,直接用那个临时变量初始化了a,而不发生拷贝。
你好,关于第三点还是有点不明白,想知道res2既然引起复制消除,那res2是如何初始化的呢[/quote] 还有一个问题 这是我不使用优化选项的结果,想问一下,为啥res2.mem的结果是0? 求大佬解答
Master Cui 2020-06-15
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
1、调用构造函数了。。。。 2、你传递的是两个临时变量给add,那个函数的参数是两个const T& 所以不会发生拷贝,以及复制 3、T a=临时变量的方式会引起复制消除,直接用那个临时变量初始化了a,而不发生拷贝。
你好,关于第三点还是有点不明白,想知道res2既然引起复制消除,那res2是如何初始化的呢
真相重于对错 2020-06-15
  • 打赏
  • 举报
回复
1、调用构造函数了。。。。 2、你传递的是两个临时变量给add,那个函数的参数是两个const T& 所以不会发生拷贝,以及复制 3、T a=临时变量的方式会引起复制消除,直接用那个临时变量初始化了a,而不发生拷贝。
编程小耗子 2020-06-14
  • 打赏
  • 举报
回复
在windows平台,他会有深拷贝,但是在linux平台没有,可能是编译器的机制导致的

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧