C++ 函数返回值为对象并不调用复制构造函数

在 「C++ Primier」中作者告诉我们复制构造函数的调用时机有下列几种:

  1. 当用一个类对象去初始化另外一个类对象(类似于 AClass aInstance = bInstance),这里不是调用赋值构造函数(也叫赋值重载运算符)。复制是说初始化,赋值是初始化后重新覆盖旧值
  2. 函数形参是类对象
  3. 函数返回值为对象,函数执行完返回时会生成一个临时对象,将值复制给临时对象

但第 3 条验证时发现并不调用复制构造函数。

#include <iostream>
using namespace std;

class CTest
{
public:
     CTest(){}
     ~CTest(){ }

     CTest(const CTest &test)
     {
          cout<<"copy constructor."<<endl;
     }

     void operator=(const CTest &test)
     {
          cout<<"operator="<<endl;
     }

     void Test(CTest test)
     {}

     CTest Test2()
     {
          CTest a;
          return a;
     }

     void Test3(CTest &test)
     {}

     CTest &Test4()
     {
          CTest *pA = new CTest;
          return *pA;
     }
};

int main()
{
     CTest obj;
     CTest obj2; 
     obj2 = obj.Test2();
     return 0;
}

结果打印

operator=

相当于 obj2 = 这一步的 = 调用了重载运算符函数

编译选项改为 g++ test.cpp -o test -fno-elide-constructors

结果打印

copy constructor.
operator=

这里被 GCC 优化,返回值为对象时,不再产生临时对象,因而不再调用复制构造函数。

参考

http://blog.csdn.net/sxhelijian/article/details/50977946

转载于:https://my.oschina.net/lvyi/blog/753639

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值