拷贝构造

拷贝构造:将现有对象到构造函数拷贝一部分

拷贝构造的几种形式:(调用后应该是会走到类中的拷贝构造函数中,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);

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值