拷贝构造:将现有对象到构造函数拷贝一部分
拷贝构造的几种形式:(调用后应该是会走到类中的拷贝构造函数中,Ctest(const Ctest& a))
1.Ctest st2(st1);
2.Ctest st3 = st1;
3.Ctest *st4 = new Ctest(st1);//指针类型
拷贝构造能能够将非静态成员的值复制,静态成员是本身类的属性,不需要复制。
浅拷贝:拷贝构造可以在代码上省略,不写Cstu(const Cstu& a),直接会执行,自动将构造函数中到非静态成员赋值。如果写了拷贝构造函数的话,会运行拷贝构造函数。(如下图例子)
深拷贝:类中带有指针的变量(如下程序会崩溃)
程序崩溃理由:当t1创建了一个对象的时候,创建了一个指针,但是实际上a中存放的地址在调用完后已经被delete掉了,a指向的地址已经被释放掉了,当调用t2的时候,在析构函数的时候,还是会delete一遍,delete重复一个空间。实际上是对同一块空间进行了多次释放。拷贝构造没有申请新的空间。
深拷贝例子:
再次说明一下this指针的作用,只能在类中使用,指向类中元素。this->i[0] = 2 ,等同于i[0]=2。
深拷贝的精髓在于需要为b中的指针数据创造一个新的空间。
!!当使用深拷贝的时候,普通的变量也需要加上。
细节方面:
当 Ctest t2 = t1;的时候,Ctest &b 中的b就是t1
所以是i[0] = b.i[0]; 将t1中的i[0]赋值给现在对象中的i[0]
或者在main函数中就通过引用来进行对象的直接复制。将对象a直接引用。
Ctest& fun(Ctest& a)
{
return a;
}
在main中调用:
Ctest t3 = fun(t1);