文档章节

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

兔之
 兔之
发布于 2016/09/30 10:04
字数 311
阅读 119
收藏 0

在 「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

© 著作权归作者所有

共有 人打赏支持
兔之
粉丝 68
博文 247
码字总数 95896
作品 7
深圳
程序员
私信 提问
C++雾中风景6:拷贝构造函数与赋值函数

在进行C++类编写的过程之中,通常会涉及到类的拷贝构造函数与类的赋值函数。初涉类编写的代码,对于两类函数的用法一直是挺让人困惑的内容。这篇文章我们会详细来梳理拷贝构造函数与赋值函数...

LeeHappen
2018/01/17
0
0
C++11 中值得关注的几大变化

源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变...

雅各宾
2014/01/17
0
0
C++11 中值得关注的几大变化(详解)

源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变...

红薯
2011/08/19
3.2K
14
C++11 中值得关注的几大变化(详解)

转自:http://coolshell.cn/articles/5265.html 源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以...

长平狐
2013/01/11
173
0
C++基础教程之构造函数与析构函数

构造函数 当我们需要在对象创建时初始化一些数据的时候,我们不可能提供一个普通的成员方法供程序猿在对象创建后调用。因为如果程序猿故意或者无意间忘记了调用该方法,就可能导致程序出现偏...

这个人很懒什么都没留下
2018/09/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

把iOS中block代码异步执行通过信号量变成同步执行

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [self downZipFile:^(BOOL downSucceed) { dispatch_semaphore_signal(semaphore); }]; dispatch_semaphor......

壹峰
13分钟前
1
0
excel函数使用

拼接多个字段 =CONCATENATE(B2,C2,D2,E2) 通过函数把一个sheet里面的字段搂到另一个sheet F2 唯一匹配另一个sheet的字段。 www 另一个sheet的名称 H:I www这个sheet里面从H行到I行。 2 从第几...

贾峰uk
15分钟前
1
0
SpringBoot 集成 DBUnit 、database-rider与H2数据库进行单元测试

单元测试 什么是单元测试 参考维基百科: 单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在...

Tree
16分钟前
0
0
java基础知识目录

java 注解

细节探索者
18分钟前
1
0
第一个网络爬虫

准备工作 http请求头概念 1、Accept :请求报头域,用于指定客户端可接受哪些类型的信息。 2、Accept-Language :指定客户端可接受的语言类型。 3、Accept-Encoding :指定客户端可接受的内容...

轻轻的往前走
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部