C++拷贝构造函数被调用的时机
拷贝构造函数调用的几种情况:
- 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值。
- 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。(这里可有可能被编译器优化)
- 当函数的返回值是类对象时,系统自动调用拷贝构造函数。(注意会有编译器可能会进行优化,而观察不到拷贝的发生)
举例说明:
#include<ctime>
#include<cstdlib>
#include<iterator>
#include<algorithm>
#include<iostream>
#include<numeric>
using namespace std;
class A {
public:
A():data(0){}
A(const A& a){
data = a.data;
cout << "拷贝构造函数调用\n";
}
A& operator=(const A&a){
data = a.data;
cout << "调用赋值函数\n";
return *this;
}
int data;
};
void fun1(A a) {
return ;
}
A fun2() {
A a;
return a;
}
int main() {
A a;
A b(a); //用类的一个对象a去初始化另一个对象b
A c = a; //用类的一个对象a去初始化另一个对象c,注意这里是初始化,不是赋值
fun1(a); //形参为类对象,实参初始化形参,调用拷贝构造函数。
A d = fun2(); //函数返回一个类对象时, 这里可能会被编译器优化,从而可能没有调用拷贝构造
d = a; //d已经初始化过了,这里是赋值,调用赋值函数
return 0;
}
需要注意,在第三条:当函数的返回值是类对象时,系统自动调用拷贝构造函数。这里默认情况下一般会被编译器优化,减少不必要的拷贝构造,所以,具体的返回值可能会因编译器及编译选项的不同而不同。使用g++编译器,关闭优化g++ xxx.cpp -fno-elide-constructors后执行结果如下:
拷贝构造函数调用
拷贝构造函数调用
拷贝构造函数调用
拷贝构造函数调用
拷贝构造函数调用
调用赋值函数
默认情况下,优化后的结果如下:
拷贝构造函数调用
拷贝构造函数调用
拷贝构造函数调用
调用赋值函数
编译器具体是怎么优化的,一般编译器会先看支不支持拷贝优化,如果不支持,再看有没有定义移动构造函数,如果都没有,就调用拷贝构造函数。更具体的细节可以参考移动语义及拷贝优化的内容。
C++拷贝构造函数被调用的时机的更多相关文章
- 【校招面试 之 C/C++】第4题 拷贝构造函数被调用的3个时机
1.被调用的3个时机: (1)直接初始化或拷贝初始化: (2)将一个对象作为一个实参传递,形参采用非指针或非引用的对象进行接收时(指针即指向了同一块空间,并未实现拷贝:而引用就是实参本身): (3)函 ...
- C++拷贝构造函数的调用时机
一.拷贝构造函数调用的时机 当以拷贝的方式初始化对象时会调用拷贝构造函数,这里需要注意两个关键点,分别是以拷贝的方式和初始化对象 1. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填 ...
- 【转】C++的拷贝构造函数深度解读,值得一看
建议看原帖 地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...
- C++拷贝构造函数详解(转载)
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员 ...
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- [016]转--C++拷贝构造函数详解
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员 ...
- C++拷贝构造函数详解 转
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy int a = 100; int b = a; 而类对象与普通 ...
- c++拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面 ...
- C++拷贝构造函数详解
转自:http://blog.csdn.net/lwbeyond/article/details/6202256 对于一个空类,编译器默认生成四个成员函数:默认构造函数.析构函数.拷贝构造函数.赋值函 ...
随机推荐
- PHP正则表达式语法汇总
首先,让我们看看两个特别的字符:'^' 和 ‘$' 他们是分别用来匹配字符串的开始和结束,一下分别举例说明"^The": 匹配以 "The"开头的字符串;&qu ...
- mybatis-generator生成的mapper中的
int updateByExampleSelective(@Param("record") Shop record, @Param("example") Sho ...
- Gradle 多环境URL请求设置
在开发过程中,多环境配置是经常遇到的,比如在Android开发过程中,在不同环境上请求服务器的URL是不同的,使用Gradle进行管理,是非常方便的. 首先查看工程目录结构: 使用AndroidStu ...
- 一篇文章根治各种HR面的套路问题,文章给出参考答案
引 IT 行业更重要的是技术面. HR 面只是最后一道把关, 检查这个应聘者是否存在一些 "致命缺陷". 所以整体的面试过程, 大家要保持不卑不亢, 淡定从容, 条理清晰, 沉着稳 ...
- python监听、操作键盘鼠标库pynput详细教程
§ 0.0.0 前言 监听.操作鼠标.键盘是实现自动化的捷径,比如我实现自动化签到用到了模拟键盘操作. pynput是监听.操控鼠标和键盘的跨平台第三方python库. 你可以通过pip insnal ...
- 【雕爷学编程】MicroPython动手做(04)——零基础学MaixPy之尝试运行
1.hello micropython #MicroPython动手做(04)——零基础学MaixPy之基本示例 #程序之一:hello micropython #MicroPython动手做(04) ...
- ArrrayList底层代码的实现
定义变量 首先要想实现该块代码,必须定义三个私有变量. private Object[] elementData;该变量用来存储容器中元素的个数. private int size:该变量表示当前容器 ...
- 《C程序设计语言》 练习3-5
问题描述 练习 3-5 编写函数 itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中.例如,itob(n, s, 16)把整数n格式化成十六进制整数保存在 ...
- apache.zookeeper-3.4与apache.kafka-2.11的安装
zookeeper与Kafka集群安装 集群安装以三台机器(虚拟机,物理机等等)为例子: 192.168.200.100 ...
- 利用js实现 禁用浏览器后退| 去除上一个历史记录链接
也是查找了好多资料才找到的,这种方式,可以消除 后退的所有动作.包括 键盘.鼠标手势等产生的后退动作. <script language="javascript"> / ...