文档章节

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

兔之
 兔之
发布于 2016/09/30 10:04
字数 311
阅读 74
收藏 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

© 著作权归作者所有

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

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

LeeHappen
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
Visual Studio2010新特性--C++王者归来(3)-泛型编程-转移构造函数

泛型编程(generic programming)关注于产生通用的软件组件,让这些组件在不同的应用场合都能很容易地重用。在c++中,类模板和函数模板是进行泛型编程极为有效的机制。 什么是临时对象?定义...

junwong
2012/03/09
0
0
C++基础教程之构造函数与析构函数

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

这个人很懒什么都没留下
09/08
0
0
借助 C++ 进行 Windows 开发

Windows API 向 C++ 开发人员提出了一项挑战。组成 API 的众多库大都表现为 C 语言风格的函数和句柄或是 COM 风格的接口。这些用起来都不太方便,需要进行一定的封装或间接操作。 C++ 开发人...

junwong
2012/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

驰狼课堂

http://www.chilangedu.com/

求是科技
11分钟前
0
0
jumpserver 报错"Incorrect string value

申明 本文所有内容参考自jumpserver记录命令无法入库问题 #1773 简介 jumpserver 1.4.0在jumpserver.log中大量报错,错误日志 File "/opt/jumpserver/apps/terminal/api.py", line 246, i...

zhnxin
17分钟前
1
0
用户管理相关配置文件及命令

9月19日任务 2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 扩展知识 实用小工具 简单命令行下实现Linux/Windows文件互传 前提:使用远程工具Xsh...

robertt15
36分钟前
0
0
presto 架构

presto 介绍 是Facebook开源的,完全基于内存的并⾏计算,分布式SQL交互式查询引擎 是一种Massively parallel processing (MPP)架构,多个节点管道式执⾏ ⽀持任意数据源(通过扩展式Connect...

张欢19933
36分钟前
0
0
Ajax技术应用

1. 相关概述 1. ajax:即异步js与xml,可以实现客户端与服务端之间数据的异步交互。对于普通的B/S 模式是采用的同步方式,即一次请求必须等待一次服务器响应完成,而异步则是客户端发送请求后...

江左煤郎
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部