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

来源:互联网 发布:淘宝原产地政府背书 编辑:程序博客网 时间:2024/06/12 22:22

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


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

0 0