科锐课堂笔记:2017/4/10 构造函数与析构函数

  一个类如果有初始化操作申请、释放资源,应该把这些操作放在构造函数与析构函数中完成。因为编译器在生成代码时,在类对象的定义和生命周期结束前会主动调用构造与析构函数,对于局部对象在进入该函数前调用构造,退出函数前调用析构,对于全局对象而言,在进入main函数前(VC运行时启动函数中)和退出main前调用。这样做避免了手动调用函数出现的多次释放、申请释放遗漏不匹对,从而造成内存泄露或程序异常等情况。
  构造函数:
  用于申请资源、初始化,构造函数名与类名相同,并且没有返回值(源码层),构造函数可以有参数也能重载,在定义一个类对象时,编译器会根据传入的不同参数选择调用对应的构造函数。不能手动调用构造函数。
  拷贝构造函数是一个特殊的构造函数,它只有一个该类引用的参数,编译器在以下3种情况下会生成调用拷贝构造函数的代码:
  1. 定义一个类对象时赋值另一个类对象。
  2. 类对象作为函数参数时。(把实参赋值给形参,等同定义赋值)
  3. 类对象作为函数返回值。(返回是通过调用方局部变量空间的,实际上也是赋值拷贝)
  如果没有显示定义类的拷贝构造函数,编译器默认的做法直接将类对象内存拷贝到新对象,称作浅拷贝,如果类成员有堆指针,此时多个对象要注意合理分配释放的问题,最简单的办法是通过定义拷贝构造函数进行深拷贝(重载分配一块堆并指向它)解决这类问题。
  析构函数:
  用于释放资源、反初始化,析构函数名是类名前加~,析构函数无参无返回值,也就不存在重载不重载问题。在VC编译器中允许手动调用析造函数。


  C++有了类的概念和方法,也新增了new、delete两个操作符(成对使用),其最主要的功能用来新建类对象和删除对象,当然用来分配释放基本数据类型也可以。与malloc、free的不同是除了分配释放空间外,它们还会调用构造与析构函数。另外需要注意的是如果new分配一组对象,在释放时需要使用delete[],delete[]会按逆序逐个调用析构函数后释放堆空间,而delete只调用了一次析构,可能使资源得不到正确的释放(如果在析构中有)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值