C++ 浅复制
接下来,我们准备为大家介绍"浅复制"
浅复制——当同一个类所定义的不同对象之间进行赋值操作时,且类中没有定义复制构造函数,那么,系统就会将属性一个一个地复制给赋值的目标对象,而这个操作就称为“浅复制”。
而什么是“复制构造函数”,将在下一章结合“深复制”为大家进行说明。
那么,我们先看看下面的例子,就可以更直观地了解到什么是浅复制了。
例子:
class Person //定了一个描述人的类Person
{
public:
char *Name; //名字属性
int age; //年龄属性
Person() //默认构造函数
{
Name = new char[50]; //通过new分配一个字符型数组的内存空间,并返回
内存地址给Name
}
}
Person p1; //通过Person类定义了一个对象p1
Person p2; //通过Person类定义了另一个对象p2
p2 = p1; //把同一个类所定义的对象赋给另一个对象,由于,类中没有定义“复制构造函数”,
所以,系统就会将p1中所有的属性复制给p2,其中包括属性Name所指向的
内存空间址,即把p1的Name所保存的地址复制给了p2的Name,从而,
两个Name都指向了同一个内存空间地址。
void main()
{
delete p1.Name; //正确,通过delete释放p1对象中的Name属性所指的内存空间
delete p2.Name; //错误,因为,Name所指向的内存空间已经在上一行被释放了
看例子分析中的(2)和(3)
}
例子分析:
(1)当程序执行p2=p1时,由于,类中没有定义“复制构造函数”,所以,系统就会将p1中所有的属性复制给p2
(2)由于类中的“默认构造函数”调用了new分配内存空间,并将内存空间地址保存于属性Name中,所以,当程序执行p2=p1时,p1对象中的属性Name所保存的地址就会赋给p2对象中的属性Name,所以,经过这个赋值操作后,p1的Name与p2的Name就指向了同一个内存空间。
(3)当执行delete p1.Name时,就可以释放Name所指向的内存空间,同时,由于执行了p2=p1的浅复制,所以,p2的Name与p1的Name所指向的内存地址是一样的,所以,当执行delete p2.Name时,由于,所指向的内存空间已经在执行delete p1.Name时释放了,所以,当执行delete p2.Name时就报错了。
小结:
当进行了“浅复制”时,如果,类中有分配资源,例如:new操作,或打开文件的,在释放已分配资源时,记住只需要对其中一个对象执行一次释放操作就可以了,因为,进行过“浅复制”的对象,它们所分配的资源所指向的内存空间或文件都是相同的。
通过上面的学习,相信大家对浅复制有了一个初步了解,但是,如何灵活地运用这个知识点呢?那么,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对该知识点的理解和运用,以及“尽快进入到编程的状态”。
要达到灵活运用,是需要通过不停地反复训练才可以做到,所以,不要停留在理论规则上面,快动起来吧!
(通过游戏模式学习与训练,需要在电脑上运行)