浅拷贝与深拷贝
来源:互联网 发布:young网络注册的域名 编辑:程序博客网 时间:2024/06/13 10:33
文章来源:http://ticktick.blog.51cto.com/823160/194307
如果没有自定义复制构造函数,则系统会创建默认的复制构造函数,但系统创建的默认复制构造函数只会执行“浅拷贝”,即将被拷贝对象的数据成员的值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,delete该指针时则会导致两次重复delete而出错。下面是示例:
#include <iostream.h>#include <string.h>class Person {public : // 构造函数 Person(char * pN) { cout << "一般构造函数被调用 !\n"; m_pName = new char[strlen(pN) + 1]; //在堆中开辟一个内存块存放pN所指的字符串 if(m_pName != NULL) { //如果m_pName不是空指针,则把形参指针pN所指的字符串复制给它 strcpy(m_pName ,pN); } } // 系统创建的默认复制构造函数,只做位模式拷贝 Person(Person & p) { //使两个字符串指针指向同一地址位置 m_pName = p.m_pName; } ~Person( ) { delete m_pName; } private : char * m_pName;}; void main( ){ Person man("lujun"); Person woman(man); // 结果导致 man 和 woman 的指针都指向了同一个地址 // 函数结束析构时 // 同一个地址被delete两次} // 下面自己设计复制构造函数,实现“深拷贝”,即不让指针指向同一地址,而是重新申请一块内存给新的对象的指针数据成员Person(Person & chs);{ // 用运算符new为新对象的指针数据成员分配空间 m_pName=new char[strlen(p.m_pName)+ 1]; if(m_pName) { // 复制内容 strcpy(m_pName ,chs.m_pName); } // 则新创建的对象的m_pName与原对象chs的m_pName不再指向同一地址了}
0 0
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 作用域、执行环境、闭包
- java 运行 linux shell 命令
- 非递归实现二叉树的前序,中序,后序遍历打印
- 取消MySQL timestamp列默认ON UPDATE CURRENT_TIMESTAMP
- Java常见的线程安全的类
- 浅拷贝与深拷贝
- Linux基础 Shell基础学习
- 梯度上升算法迭代过程和数学原理
- batch_size 对分类器性能影响实验记录
- Oracle 软件及静默安装数据库
- 简单MVC框架搭建
- malloc 和new知识点复习
- Java反射机制详解
- WOS(Web of Science)检索规则