深拷贝和浅拷贝
2016-06-27 00:18
225 查看
拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类A的拷贝构造函数的形式为A(A& x)。以下三种情况会自动调用拷贝构造函数:
1.
一个对象以值传递的方式传入函数体
2. 一个对象以值传递的方式从函数返回
3. 一个对象需要通过另外一个对象进行初始化(eg:A=B)
如果在类中没有显式地声明一个拷贝构造函数,编译器则会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的浅拷贝。
如果类内成员变量需要动态开辟堆内存,把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。当B把内存释放了时A内的指针就是野指针了,出现运行错误。
为了避免这类错误,需要自己定义拷贝构造函数,在拷贝构造函数中,重新为A分配资源,也就是深拷贝,那么当B释放时,去访问A中的指针就不会报错。
1.
一个对象以值传递的方式传入函数体
2. 一个对象以值传递的方式从函数返回
3. 一个对象需要通过另外一个对象进行初始化(eg:A=B)
如果在类中没有显式地声明一个拷贝构造函数,编译器则会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的浅拷贝。
如果类内成员变量需要动态开辟堆内存,把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。当B把内存释放了时A内的指针就是野指针了,出现运行错误。
为了避免这类错误,需要自己定义拷贝构造函数,在拷贝构造函数中,重新为A分配资源,也就是深拷贝,那么当B释放时,去访问A中的指针就不会报错。
相关文章推荐
- 背景减除法的研究
- 基于ZigBee和STM32的智能家居控制系统的设计与实现(五)--终结篇
- VELT-0.2.8对STM32开发的支持(4):链接与调试
- API之NetworkInfo解释
- Android一键清除其他应用缓存数据,有没有什么好方法?
- 基于KVM建立虚拟机的步骤及总结说明
- jQuery梳理之表单
- ListView显示第一条数据
- bzoj4562【HAOI2016】食物链
- 【译】关于vertical-align你应知道的一切
- java爬虫-Jsoup01
- 身为网络编辑,你知道这些SEO技巧吗?
- Java8:创建Stream
- 实现将VirtualBox 虚拟机转换为KVM虚拟机的步骤
- Java NIO 系列:Java NIO Path
- 大数据Java基础第二十天作业
- qcow2、raw、vmdk等镜像格式
- GDI-图形设备接口
- HTML5 网络拓扑图性能优化
- Acitivity和Service之间消息的传递