免费注册 查看新帖 |

Chinaunix

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

[函数] 为何这里不调用拷贝构造函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-24 13:28 |只看该作者 |倒序浏览
为了看看函数返回的局部对象用来初始化另外一个对象时,其地址以及生存期,我简单的写了下面一段code:


  1. #include <iostream>

  2. using namespace std;

  3. class Complex
  4. {
  5. public:
  6.     Complex(int i, int j): x(i), y(j)
  7.     {
  8.         cout << "Constructor\t";
  9.         cout << static_cast<void*>(this) << endl;
  10.     }

  11.     Complex(const Complex &c)
  12.     {
  13.         x = c.x;
  14.         y = c.y;
  15.         cout << "Copy Constructor\t";
  16.         cout << &c << endl;
  17.     }

  18. private:
  19.     int x;
  20.     int y;
  21. };


  22. Complex Copy();

  23. int main(int argc, char *argv[])
  24. {
  25.     Complex c = Copy();
  26.     return 0;
  27. }


  28. Complex Copy()
  29. {
  30.     Complex c(1, 1);
  31.     return c;
  32. }
复制代码


输出结果是:Constructor     0xbfcdbd90
我觉得应该调用了一次构造函数,一次拷贝构造函数,不知道为什么只调用了一次构造函数。

论坛徽章:
0
2 [报告]
发表于 2006-10-24 13:39 |只看该作者
拷贝构造函数是在对象被创建时调用的。

你可以单步调试一下。

论坛徽章:
0
3 [报告]
发表于 2006-10-24 13:40 |只看该作者
我的执行结果正好相反,如下:
Constructor     0012FF10
Copy Constructor        0012FF10
Copy Constructor        0012FF70
难道是:
1.Complex c(1, 1);一次构造函数.
2.return c;一次拷贝构造函数.(局部变量返回还要拷贝吗?)
3.Complex c = Copy();一次拷贝构造函数.

高手解释一下??
谢谢!!

论坛徽章:
0
4 [报告]
发表于 2006-10-24 13:53 |只看该作者
原帖由 cuicp 于 2006-10-24 13:40 发表
我的执行结果正好相反,如下:
Constructor     0012FF10
Copy Constructor        0012FF10
Copy Constructor        0012FF70
难道是:
1.Complex c(1, 1);一次构造函数.
2.return c;一次拷贝构造函数.(局部 ...


对,就是这个过程。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-10-24 14:02 |只看该作者
请楼主用google搜索“NRV优化“。

论坛徽章:
0
6 [报告]
发表于 2006-10-24 14:29 |只看该作者
原帖由 cuicp 于 2006-10-24 13:40 发表
我的执行结果正好相反,如下:
Constructor     0012FF10
Copy Constructor        0012FF10
Copy Constructor        0012FF70
难道是:
1.Complex c(1, 1);一次构造函数.
2.return c;一次拷贝构造函数.(局部 ...


请问你用的是什么编译器,我用的是GCC

论坛徽章:
0
7 [报告]
发表于 2006-10-24 14:36 |只看该作者
lz你的编译器是否打开了优化选项,所以

Complex c = Copy();

这句给优化掉了。你啥都没看到。

论坛徽章:
0
8 [报告]
发表于 2006-10-24 14:53 |只看该作者
原帖由 lenovo 于 2006-10-24 14:02 发表
请楼主用google搜索“NRV优化“。

我搜了一下,应该是编译器帮我们做了一些事情,呵呵

论坛徽章:
0
9 [报告]
发表于 2006-10-24 15:09 |只看该作者
原帖由 lesser1985 于 2006-10-24 14:29 发表


请问你用的是什么编译器,我用的是GCC



我用的是win32下的vc++6.0,应该是cl吧,
cl.exe nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\constr.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c

link.exe

debug和release执行结果都一样!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP