关于构造函数,析构函数,拷贝函数(浅拷贝问题)的见解

在C++中编辑器会自定义三种函数

分别是构造函数,析构函数,拷贝构造函数

构造函数:为对象的成员属性赋值,构造函数由编译器自动调用 没有返回值也不写void,函数名称与类名相同,可以有参数,可 以发生重载

当我们的属性为私有时,在类外访问不到,想要初始化和修改属性,就需要借助成员函数非常麻烦

当我们使用构造函数时就会很轻松

构造函数可以进行重载,因为可以有参数,我们也可以通过重载给属性赋值

系统自定义的默认构造函数只具有一个空的函数体,只要我们调用到类就会调用默认构造函数,并且只调用一次,当我们自定义构造函数,无论是有参还是无参,编辑器都不会再为我们定义默认构造函数

调用默认构造函数时不要加括号,直接实例化对象就会自动调用,加上括号系统会认为这是一个函数声明

析构函数:在对象销毁前系统自动调用,进行清理,没有返回值 也不用写void,函数名称与类名相同在左名称加~,不可以有参 数不能进行重载

由上对比可知,第一幅图是在main函数中调用类,所以是在程序运行结束在调用析构函数销毁类

而第二幅图是在test函数中调用类,函数存储在栈区,调用完毕即销毁释放,所以会在此时调用析构函数

以此证明当类销毁时,系统会自动调用析构函数,无论是系统自定义的默认析构函数还是我们自定义的析构函数

析构函数不仅仅只是为了销毁对象,当类属性中带有指针,并且我们想传入数据并将数据存储在堆区中时,我们就需要析构函数有释放堆区的功能,因为堆区是由程序员自己开辟自己手动释放的

我们需要在析构函数中写一个判断函数来进行堆区的释放,这就是自定义析构函数的作用

拷贝构造:类名(const类名&对象)即Person(const Person&p)

当我们自定义拷贝函数时,系统便不会再提供默认构造函数,包括有参和无参

使用拷贝构造的时机:

1. 使用一个创建完毕的对象来初始化一个新的对象

不仅可以初始化本对象,还可以利用其他类初始化本类

其本质就是将一个类传递过去进行拷贝,浅拷贝便是赋值操作,自定义的深拷贝由程序员自己定义其作用

2. 值传递的方式给函数参数传值

值传递即系统会拷贝一份临时副本,此时便会自动调用默认拷贝函数

3. 以值方式返回局部对象

同样作为值放回也会调用默认拷贝函数

当利用拷贝函数时还要注意浅拷贝问题,浅拷贝就是默认拷贝,只提供赋值

当浅拷贝对象里有指针存在指向堆区时,浅拷贝只对这个指针赋值,所以只复制了指针,导致两个指针指向同一份堆空间

当我们进行堆区释放时,便会对这份堆区进行重复释放导致非法访问

所以我们需要自定义拷贝函数进行深拷贝解决这类问题

这就是浅拷贝的错误

深拷贝就是把注释的自定义拷贝函数解开

以上就是对构造函数和析构函数的理解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值