C++构造函数、拷贝构造函数(深拷贝、浅拷贝)

之前,我们说过构造函数在对象定义时调用,完成对象数据成员的初始化工作。

其实,拷贝构造函数是构造函数的重载形式。

拷贝构造函数是 利用一个已经存在的对象在生成一个新的对象。这种初始化的方式需要调用拷贝构造函数,若不定义拷贝构造函数,系统会自动生成默认的拷贝构造函数,把已经存在的对象的数据按位复制到新生成的对象的空间,但这种做法有时会出现问题。(往往在析构的时候会出现问题)。

一.拷贝构造函数特点

1.参数只有一个必须使用引用传参,若使用传参形式会出现无穷递归调用(见下代码)

class Date
{
public:
    Date(Date d)//传参形式
    {
        _year=d._year;
        _month=b._month;
    }

private:
    int _yaer;
    int _month;
};

以上是传参形式,会产生递归拷贝构造,编译不通过。原因是在传参时,会调用拷贝构造生成临时变量,而在拷贝构造里调用拷贝构造就相当于套娃,会产生递归,再次声明禁止套娃!!!

注意:拷贝构造函数定义在类内在调用时更加方便。

解决办法 传引用(加const 只读)

Date(const Date& d)
{
    _year=d._year;
    _month=d._month;
}

在调用拷贝构造函数时

Date d1(2023,5);//构造
Date d2(d1);//拷贝构造
Date d3=d1;//拷贝构造

 二.什么时候调用拷贝构造函数

1.对象进行初始化;

2.函数参数对象是类的对象。

3.函数返回值是类的对象。

浅拷贝和深拷贝:

如果在有动态空间开辟的类(栈类,顺序表,链表,队列)中,浅拷贝往往会出现问题。原因是浅拷贝只是单纯的按值复制,内存没有变化,在析构时,会将空间析构两遍(出现问题,导致崩溃)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发尚存的猿小二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值