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操作,或打开文件的,在释放已分配资源时,记住只需要对其中一个对象执行一次释放操作就可以了,因为,进行过“浅复制”的对象,它们所分配的资源所指向的内存空间或文件都是相同的。

 

 

 

  通过上面的学习,相信大家对浅复制有了一个初步了解,但是,如何灵活地运用这个知识点呢?那么,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对该知识点的理解和运用,以及“尽快进入到编程的状态”

 

  要达到灵活运用,是需要通过不停地反复训练才可以做到,所以,不要停留在理论规则上面,快动起来吧!

 

 

(通过游戏模式学习与训练,需要在电脑上运行)

进入游戏学习与训练