C++ 对象的深复制

  

1、对象的深复制

   在C++语言中,同一个类所定义的不同对象之间进行赋值操作时,如果,类中定义复制构造函数,

那么,就会先调用(复制构造函数)进行相应的内存分配操作,如:new操作,然后,系统就会将属性一个一个地

复制给赋值的目标对象,而这个操作就称为(对象的深复制)。

  当进行了(对象的深复制)时,如果,类中有分配资源,例如:new操作,或打开文件的,

在释放已分配资源时,需要对该(对象)执行一次释放操作就可以了,因为,进行过(深复制)的对象,

它们所分配的资源所指向的内存空间或文件都是不同的。

 

2、什么是(复制构造函数)

   复制构造函数,就是一个带有参数的构造函数,而这个参数是(一个类的对象)。

 

3、复制构造函数的语法格式:

   类名(类名 &参数名)

   {

      代码;

   }

 

  语法格式分析:

  (1)当前所在类的类名。

  (2)一对小括号。

  (3)参数的类形,必须是当前所在类的类名。

  (4)必须是& 。

  (5)参数名,按C变量命名规则定义即可。

  (6)一对大括号,大括号中编写主体代码。

 

4、 例子:

       class Human  //定义了人类

       {
           public:
             int head;
             int body;
             int leg;
             int hand;
             int eye;
             int mouse;
             int ear;
             int nose;

             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所指向的内存空间

 

不要停留在理论学习上,尽快转到真实环境进行代码编写实践,请下载下方的训练环境。

>>>下载训练环境与使用说明(使用真实的开发环境,结合游戏闯关进行编程训练)