C++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数:
X::X(const X&);
X::X(X&, int a=);
X::X(X&, int a=, int b=);
那么什么时候调用拷贝构造函数呢?
1.对象以值传递的形式传入参数
int main()
{
CExample test();
//传入对象
Fun(test); return ;
}
调用Fun时过程如下:
(1)test对象传入函数时,创建一个临时变量temp
(2)调用拷贝构造函数把test的值赋给临时变量,类似于CExample temp(test)
(3)Fun调用结束后,析构掉temp
2.对象以值传递的方式从函数返回
CExample Fun()
{
CExample object();
return object;
}
当Fun函数执行到return时,步骤如下:
(1)先产生一个临时变量temp
(2)调用拷贝构造函数把object赋值给temp,类似于CExample temp(object)
(3)函数执行到最后先析构掉局部变量object
(4)Fun执行完后析构掉temp
关于浅拷贝和深拷贝:
所谓浅拷贝,指的是在对象复制时,只对对象中的成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了。对
深拷贝的适用范围是对象存在动态成员,在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间,要不然就像浅拷贝一样释放对象时对同一内存空间会释放2次,这是错误的。
C++拷贝构造函数的更多相关文章
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别
class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...
- C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导 ...
- PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天
PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1 关于转换构造函数 ClassDemo demo = 1; 调用转换构造函数 2 关于拷贝赋值函数 demo =2; 首 ...
- C++拷贝构造函数(深拷贝,浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #i ...
- C++ 拷贝构造函数 和 六大函数
1. C++什么时候会调用 拷贝构造函数? a.一个对象作为函数参数,以值传递的方式传入函数体: b.一个对象作为函数返回值,以值传递的方式从函数返回:(实际使用时,会被编译器优化掉) c.一个对象 ...
- 一个CString的实现 拷贝构造函数的应用
class CString { public: CString (char* s); CString(); ~CString(); private: char *str; int len; stati ...
- 【转】C++的拷贝构造函数深度解读,值得一看
建议看原帖 地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...
- C++拷贝构造函数(深拷贝,浅拷贝)
http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; ...
随机推荐
- 在 Visual Studio 中调试时映射调用堆栈上的方法
本文转自:https://msdn.microsoft.com/zh-cn/library/dn194476.aspx 1.创建代码图,以便在调试时对调用堆栈进行可视化跟踪. 你可以在图中进行标注以跟 ...
- MSSQL sp_helptextplus
默认的sp_helptext 如果存储过程每行代码太长会自动截断 把这个sp_helptextplus添加到SSMS的keyboard快捷键里面 SET QUOTED_IDENTIFIER ON SE ...
- VMware 虚拟机桥接网络设置
一.桥接的基本原理 配置成桥接网络连接模式的虚拟机就当作主机所在以太网的一部分,虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑,可以像主机一样可以访问以太网中的所有共享资源和网络连 ...
- WPF绘制矢量图形模糊的问题
WPF默认提供了抗锯齿功能,通过向外扩展的半透明边缘来实现模糊化.由于WPF采用了设备无关单位,当设备DPI大于系统DPI时,可能会产生像素自动扩展问题,这就导致线条自动向外扩展一个像素,并且与边缘相 ...
- dos命令记录以及dos下通过进程id查找工作路径
dos命令 tasklist |findstr "1696" 通过进程id查看进程名 tasklist 列出所有进程 netstat -ano 查看当前网络通信进程连接的各种状态 ...
- Response.ContentType 详细列表
不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 text/html 也就是网页格式. 代码如: <% response.ContentType =&quo ...
- note->notice
登陆博客园,乍眼一看上一篇博客的日期还是2月底,如今已是5月份,期间好几次想要记录一些东西,总感觉现在一天二十四小时越来越短,有几次登陆博客园甚至连密码都要重置一下才能登陆...这两个月的时间里经理了 ...
- Office 365 系列五 -------- Imap邮箱迁移步骤
当客户购买了我们的Office 365之后,第一个功能必然是会用我们的企业邮箱,如果企业之前是用 263.腾讯.网易等的邮件厂商的话,必然会涉及到邮件的迁移, 其实说到邮箱迁移,我们办法很多,如果人数 ...
- InnoDB is limited to row-logging when transaction isolation level is READ COMMIT
分析: http://blog.csdn.net/lingli219/article/details/46372737 解决办法: http://niuzhenxin.iteye.com/blog/1 ...
- loadrunner-VUserGen录制脚本及回放时注意的问题
乱码问题 1.1录制过程中的乱码(因为本机系统的编码格式跟被测系统的编码格式不一致导致): 1.2运行时的乱码(录制后的脚本编码格式跟被测系统的编码格式不一致导致): 解决:1.Tools-Recor ...