为什么不执行拷贝构造函数呢?

oldrealman 2014-03-27 01:08:55
看下面的程序, 为什么结果是
base(42)
derived(42)
~derived(42)
~base(42), 而不执行拷贝构造函数呢?, 但是当把
最后一个语句derived d = make_derived();
换成
Derived d1(42);
derived d = d1;
就会执行拷贝构造函数了

#include <iostream>
#include <vector>

class base
{
public:
base(int value):value_(value) { std::cout << "base(" << value << ")\n"; }
base():value_(0) { std::cout << "base()\n"; }

base(base const& copy)
:value_(copy.value_)
{ std::cout << "copy base(" << value_ << ")\n"; }


~base() { std::cout << "~base(" << value_ << ")\n"; }


int value() const { return value_; }


private:

int value_;

};


class derived : public base
{

public:

derived(int value): base(value) { std::cout << "derived(" << value << ")\n"; }

derived() : base() { std::cout << "derived()\n"; }

derived(derived const& copy)
: base(copy)
{ std::cout << "copy derived(" << value() << "\n"; }

~derived() { std::cout << "~derived(" << value() << ")\n"; }
};

derived make_derived()
{
return derived(42);
}

int main()
{
derived d = make_derived();
}
...全文
191 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-03-31
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
TheNewIpad 2014-03-31
  • 打赏
  • 举报
回复
引用 5 楼 TheNewIpad 的回复:
怪只怪你的Make_share的,写的太“优秀”了, 编译器执行了 返回构造优化。 RVO = return value optimization。 makre_share 改为如下模式,或许就不会优化了, 在vs9 debug下尝试有复制构造 derived make_derived() { derived objD(42); objD.value(); return objD; }
抱歉,记错名字了,不是RVO,而是, NRVO == Named Return Value Optimization(命名返回值优化) 具体请参考: http://msdn.microsoft.com/zh-cn/library/ms364057(vs.80).aspx
TheNewIpad 2014-03-31
  • 打赏
  • 举报
回复
怪只怪你的Make_share的,写的太“优秀”了, 编译器执行了 返回构造优化。 RVO = return value optimization。 makre_share 改为如下模式,或许就不会优化了, 在vs9 debug下尝试有复制构造 derived make_derived() { derived objD(42); objD.value(); return objD; }
JiMoKuangXiangQu 2014-03-27
  • 打赏
  • 举报
回复
建议在拷贝构造函数以及相关代码加打印语句.
oldrealman 2014-03-27
  • 打赏
  • 举报
回复
不是很明白两位的话, 那么 int main() { derived d(make_derived()); } 呢?
__cc__ 2014-03-27
  • 打赏
  • 举报
回复
引用 楼主 oldrealman 的回复:
int main() { derived d = make_derived(); }
这里应该调用了两次拷贝构造函数,不会调用复制函数。 第一次是return时候,创建一个临时的对象,这个对象是拷贝构造的; 第二次是赋值的时候,比较特殊,定义的时候初始化会直接调用拷贝构造,不会分两步(实际不同编译器处理不一样)。
Ashily_1020 2014-03-27
  • 打赏
  • 举报
回复
derived d = make_derived();,这句就只有一个对象,怎么会去调用拷贝构造函数呢?

65,207

社区成员

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

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