- 1
- 0
- 约5.63万字
- 约 9页
- 2016-08-24 发布于河南
- 举报
C类对象的复制-拷贝构造函数
C++类对象的复制-拷贝构造函数
出处:PConline 2005年03月09日 作者:管宁 责任编辑:xietaoming
文章导读:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。
在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如:
int a = 10;
int b =a;
自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如:
#include iostream
using namespace std;
class Test
{
public:
Test(int temp)
{
p1=temp;
}
protected:
int p1;
};
void main()
{
Test a(99);
Test b=a;
}
普通对象和类对象同为对象,他们之间的特性有相似之处也有不同之处,类对象内部存在成员变量,而普通对象是没有的,当同样的复制方法发生在不同的对象上的时候,那么系统对他们进行的操作也是不一样的,就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的,在上面的代码中,我们并没有看到拷贝构造函数,同样完成了复制工作,这又是为什么呢?因为当一个类没有自定义的拷贝构造函数的时候系统会自动提供一个默认的拷贝构造函数,来完成复制工作。
下面,我们为了说明情况,就普通情况而言(以上面的代码为例),我们来自己定义一个与系统默认拷贝构造函数一样的拷贝构造函数,看看它的内部是如何工作的!
代码如下:
#include iostream
using namespace std;
class Test
{
public:
Test(int temp)
{
p1=temp;
}
Test(Test c_t)//这里就是自定义的拷贝构造函数
{
cout进入copy构造函数endl;
p1=c_t.p1;//这句如果去掉就不能完成复制工作了,此句复制过程的核心语句
}
public:
int p1;
};
void main()
{
Test a(99);
Test b=a;
coutb.p1;
cin.get();
}
上面代码中的Test(Test c_t)就是我们自定义的拷贝构造函数,拷贝构造函数的名称必须与类名称一致,函数的形式参数是本类型的一个引用变量,且必须是引用。
当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,如果你没有自定义拷贝构造函数的时候系统将会提供给一个默认的拷贝构造函数来完成这个过程,上面代码的复制核心语句就是通过Test(Test c_t)拷贝构造函数内的p1=c_t.p1;语句完成的。如果取掉这句代码,那么b对象的p1属性将得到一个未知的随机值;
下面我们来讨论一下关于浅拷贝和深拷贝的问题。
就上面的代码情况而言,很多人会问到,既然系统会自动提供一个默认的拷贝构造函数来处理复制,那么我们没有意义要去自定义拷贝构造函数呀,对,就普通情况而言这的确是没有必要的,但在某些状况下,类体内的成员是需要开辟动态开辟堆内存的,如果我们不自定义拷贝构造函数而让系统自己处理,那么就会导致堆内存的所属权产生混乱,试想一下,已经开辟的一端堆地址原来是属于对象a的,由于复制过程发生,b对象取得是a已经开辟的堆地址,一旦程序产生析构,释放堆的时候,计算机是不可能清楚这段地址是真正属于谁的,当连续发生两次析构的时候就出现了运行错误。
为了更详细的说明问题,请看如下的代码。
#include iostream
using namespace std;
class Internet
{
public:
Internet(char *name,char *address)
{
cout载入构造函数endl;
strcpy(Internet::name,name);
strcpy(Internet::address,address);
您可能关注的文档
- 00保持心脏血管通畅的自然疗法.ppt
- 003整流电路.ppt
- 01 数制与编码.ppt
- 01 读写指南.ppt
- 01-Morpher[变形器].doc
- 011VDEbiaozhi.doc
- 01模电基础.ppt
- .Net Framework .NET2.0 3.0 3.5 4.0区别 Net Framework各个版本区别.doc
- .Net下XML文档的读写操作.docx
- 098闻见近录 (宋)王巩 著.doc
- 中国国家标准 GB/T 6675.9-2025玩具安全 第9部分:化学及类似活动的实验玩具.pdf
- 《GB/T 6675.9-2025玩具安全 第9部分:化学及类似活动的实验玩具》.pdf
- GB/T 46975-2025婴童用品 便携式婴儿睡篮技术要求.pdf
- 中国国家标准 GB/T 46975-2025婴童用品 便携式婴儿睡篮技术要求.pdf
- 《GB/T 46975-2025婴童用品 便携式婴儿睡篮技术要求》.pdf
- 《GB/T 6675.14-2025玩具安全 第14部分:指画颜料要求和测试方法》.pdf
- GB/T 6675.14-2025玩具安全 第14部分:指画颜料要求和测试方法.pdf
- 中国国家标准 GB/T 6675.14-2025玩具安全 第14部分:指画颜料要求和测试方法.pdf
- 中国国家标准 GB/T 33772.3-2025质量评定体系 第3部分:印制板及层压板最终产品检验及过程监督用抽样方案的选择和使用.pdf
- 《GB/T 33772.3-2025质量评定体系 第3部分:印制板及层压板最终产品检验及过程监督用抽样方案的选择和使用》.pdf
最近下载
- GB/T 17359-2023微束分析 原子序数不小于11的元素能谱法定量分析.pdf
- 工业和信息化领域数据安全风险评估实施细则.pptx VIP
- 江西省“三新”协同教研共同体2025届高三12月联考生物学试卷(含答案).docx VIP
- 配电线路器材 -横担、绝缘子.ppt
- 00J008-3钢筋砼挡土墙.pdf
- 2024年华北科技学院马克思主义基本原理概论期末考试题含答案.docx VIP
- 《配电线路工程》 课件 3-9接地装置安装.pptx
- 2025-2026学年丹阳市八年级上学期数学期末模拟试卷.docx VIP
- 配电线路防雷技术.pptx VIP
- 高二数学(文)双曲线知识精讲 人教实验版(A).doc VIP
原创力文档

文档评论(0)