浅拷贝与深拷贝
来源:互联网 发布:美版lol mac 编辑:程序博客网 时间:2024/05/16 04:48
如果没有自定义复制构造函数,则系统会创建默认的复制构造函数,但系统创建的默认复制构造函数只会执行“浅拷贝”,即将被拷贝对象的数据成员的值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,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不再指向同一地址了
}
http://ticktick.blog.51cto.com/823160/194307/
0 0
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 多式样ProgressBar
- 梯度下降(Gradient Descent)简析及matlab实现
- 蓝牙设计
- 用循环列表解决一个约瑟夫问题
- Android如何完全调试framework层代码
- 浅拷贝与深拷贝
- 你应该知道的 8 个Java 的领军人物
- iOS系统GCD学习(8):Dispatch Queue挂起恢复和目标指定
- IO之File类的应用
- hdu1042 N!
- POJ:2528 Mayor's posters(未AC)
- PL/SQL使用复合数据类型4(集合操作符、比较集合)
- 找工作处女面纪念帖
- iOS系统GCD学习(9):多核心的性能