文档章节

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

兔之
 兔之
发布于 2016/09/30 10:04
字数 311
阅读 94
收藏 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
学习《Effective C++》

学习《Effective C++》 @date: 2014-06-16 @author: gerui @email: forgerui@gmail.com   前几天买了好几本书,其中有一本是《Effective C++》,准备好好学习一下C++.书中提出了55条应该遵...

bairui
2014/06/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux-scp 远程拷贝报错原因

刚拿到一台重装后的服务器,远程ssh都正常,但是一scp拷贝东西就报错: 本地确定是有scp命令的,而且如果是本地没有scp不会报后面那句lost connection,因此就是远程没有scp这个命令。因此在...

linuxprobe16
7分钟前
0
0
OSChina 周六乱弹 —— 谁小时候没当过熊孩子呀

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《行尸走肉》- amazarashi 《行尸走肉》- amazarashi 手机党少年们想听歌,请使劲儿戳(这里) @神话 :周五了,周末干啥...

小小编辑
31分钟前
18
1
docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
14
0
1: Cordova 配置WebView可以打开外部链接

一、问题:在使用Cordova生成的Android App中默认情况下WebView中的超链接,如果不是相对链接,会默认使用浏览器打开。 如果想用默认webview打开 解决方案:修改config.xml文件添加链接配置节...

wecloudnet
今天
1
0
Beetl介绍以及集成SpringBoot2.0 ---《Beetl视频课程》(1)

目的:引导阅读官方文档 目标:实现一个自己的博客 一、Beetl介绍 Beetl目前版本是2.9.3,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点。使得开发...

Gavin-King
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部