C++ 对象的深复制
1、对象的深复制 在C++语言中,同一个类所定义的不同对象之间进行赋值操作时,如果,类中定义复制构造函数, 那么,就会先调用(复制构造函数)进行相应的内存分配操作,如:new操作,然后,系统就会将属性一个一个地 复制给赋值的目标对象,而这个操作就称为(对象的深复制)。 当进行了(对象的深复制)时,如果,类中有分配资源,例如:new操作,或打开文件的, 在释放已分配资源时,需要对该(对象)执行一次释放操作就可以了,因为,进行过(深复制)的对象, 它们所分配的资源所指向的内存空间或文件都是不同的。
2、什么是(复制构造函数) 复制构造函数,就是一个带有参数的构造函数,而这个参数是(一个类的对象)。
3、复制构造函数的语法格式: 类名(类名 &参数名) { 代码; }
语法格式分析: (1)当前所在类的类名。 (2)一对小括号。 (3)参数的类形,必须是当前所在类的类名。 (4)必须是& 。 (5)参数名,按C变量命名规则定义即可。 (6)一对大括号,大括号中编写主体代码。
4、 例子: class Human //定义了人类 { char *name; Human(int a) //带参数的构造函数 { Age = a; name = new char[50]; }
Human( Human &p ) //复制构造函数(参数的类型是Human类) { name = new char[50]; //通过new分配一个字符型数组的内存空间,并 返回内存地址给name
strcpy(name,p.name); //通过strcpy将参数p的属性name所指向的内存 空间中的名字复制到当前对象的属性name 所指向的内存空间中 } };
Human ZS; //定义了对象ZS Human LS=ZS; //由于类中定义了(深复制)构造函数, 所以,在赋值时会先调用(深复制)构造函数, 这样,就会调用new分配一个内存空间,并让name属性指向该内存空间。 所以,(LS对象中的name)与(ZS对象中的name)所指向的内存空间是不一样的。
void main() { delete ZS.name; //正确,通过delete释放ZS对象中的name属性所指的内存空间 delete LS.name; //正确,因为,LS.name所指向的内存空间是不同于ZS.name所指向的内存空间
不要停留在理论学习上,尽快转到真实环境进行代码编写实践,请下载下方的训练环境。 |