免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2686 | 回复: 4
打印 上一主题 下一主题

[C++] 赋值初始化调用构造函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-23 20:05 |只看该作者 |倒序浏览
  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5. public:
  6.     int data;
  7.     A()
  8.     {
  9.         data=0;
  10.         cout<<"A()"<<data<<endl;
  11.     }
  12.     A (int a)
  13.     {
  14.         data=a;
  15.         cout<<"A(int a)"<<endl;
  16.     }
  17.     A(A &a)
  18.     {
  19.         data=a.data;
  20.         cout<<"A(A &a)"<<data<<endl;
  21.     }
  22.     A& operator =(A& a)
  23.     {
  24.         this->data=a.data;
  25.         cout<<"operator ="<<data<<endl;
  26.         return *this;
  27.     }
  28. };

  29. int main()
  30. {
  31.     A a(3);
  32.     A b=3;     
  33.     return 0;
  34. }
复制代码
A b=3应该是复制初始化吧,
“复制初始化调用构造函数创建一个临时对象,然后将该临时对象作为参数调用复制构造函数”根据这句话的理解那么 A b=3,应该先调用 A(int)带参数的构造函数创建一个临时对象 然后再调用拷贝构造函数将临时对象复制给b  
但是我在断点执行的时候 只调用A (int)构造函数就完了 不会进入拷贝构造函数这是什么原因??

论坛徽章:
0
2 [报告]
发表于 2014-06-23 21:10 |只看该作者
A b=3; 这个写法本来就相当于 A b(3); 直接掉构造函数,而不是operator =

论坛徽章:
0
3 [报告]
发表于 2014-06-23 23:10 |只看该作者
那什么时候是复制初始化呢?回复 2# drangon


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2014-06-24 11:41 |只看该作者
被优化掉了,g++ 加上 -fno-elide-constructors选项就可以了:

A(int a)
A(int a)
A(A &a)3

不过 A (A &a)要加上const:
A(const A &a)
{
  ...
}

论坛徽章:
0
5 [报告]
发表于 2014-06-25 09:18 |只看该作者
原来是这样啊!回复 4# hellioncu


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP