1. 浅层复制构造函数
所有的复制构造函数均有一个参数,即对同一个类的对象的引用。
A(A&a)
由于需要复制的对象一般不会更改,我们通常将引用定义为常量引用,这样构造函数就不用改变传递进来的对象。
A(const A&a)
这样函数就根据对象a来生成一个拷贝。这个a只是形式参数。它代表传递进来的对象。
编译器提供了默认构造函数和析构函数,同样也提供了复制构造函数,编译器提供的默认的复制构造函数只是把传递进来的
对象的每个成员变量复制到新对象的成员变量中去。然后两个对象中的变量均指向内存放类成员变量的内存区域。假如
该变量不是指针变量,一般不会出错,假如该变量是指针变量。
这样对象a有一个指针成员变量x,它指向存放6的那块内存区域,我们将对象a复制到对象b,如:
A b =(a);
由于要复制对象,因此自动调用默认复制构造函数,调用过程如下图所示。
首先将对象a作为参数传递到默认复制构造函数,调用过程如下。
首先将对象a作为参数传递到默认复制函数中,然后将对象a的指针成员变量X复制到对象b中,这样两个对象的指针X现在都指向同一内存区域。
当这两个对象中的任何一个超出作用域时,都会出现致命错误。比如我们将对象A删除,那么析构函数就会自动释放6的那块内存空间,而对象
b的指针变量x任然指向该空间,由于该空间已经不存在,那么对象b的指针变量x就变成一个野指针,该程序就处于崩溃的边缘。