面试_c++_构造函数与析构函数

190 阅读3分钟

构造函数、析构函数不能被继承

构造函数

1. 构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用它的构造函数。一般来说, 构造函数有以下三个方面的作用: ​ ■ 给创建的对象建立一个标识符; ​ ■ 为对象数据成员开辟内存空间; ​ ■ 完成对象数据成员的初始化。


**2. 默认构造函数** 当用户没有显式的去定义构造函数时, 编译器会为类生成一个默认的构造函数, 称为 "**默认构造函数**", 默认构造函数不能完成对象数据成员的初始化, 只能给对象创建一标识符, 并为对象中的数据成员开辟一定的内存空间。不带参数,不包含函数代码。
**3. 构造函数的特点** 无论是用户自定义的构造函数还是默认构造函数都主要有以下特点: ①. 在对象被创建时自动执行; ②. 构造函数的函数名与类名相同; ③. 没有返回值类型、也没有返回值; ④. 构造函数不能被显式调用。
#给Python程序员的注释: C++中的构造函数类似于Python中的 __init__ 方法.



析构函数

与构造函数相反, 析构函数是在对象被撤销时被自动调用, 用于对成员撤销时的一些清理工作, 例如在前面提到的手动释放使用 new 或 malloc 进行申请的内存空间。析构函数具有以下特点: ■ 析构函数函数名与类名相同, 紧贴在名称前面用波浪号 ~ 与构造函数进行区分, 例如: ~Point(); ■ 构造函数没有返回类型, 也不能指定参数, 因此析构函数只能有一个, 不能被重载; ■ 当对象被撤销时析构函数被自动调用, 与构造函数不同的是, 析构函数可以被显式的调用, 以释放对象中动态申请的内存。

#给Python程序员的注释: C++中的析构函数类似于Python中的 __del__ 方法.

当用户没有显式定义析构函数时, 编译器同样会为对象生成一个默认的析构函数, 但默认生成的析构函数只能释放类的普通数据成员所占用的空间, 无法释放通过 new 或 malloc 进行申请的空间, 因此有时我们需要自己显式的定义析构函数对这些申请的空间进行释放, 避免造成内存泄露。


派生类中构造函数与析构函数,调用顺序

  构造函数的调用顺序:

  基类构造函数---->成员类对象构造函数---->派生类构造函数。

  析构函数正好和构造函数相反。


为什么析构函数需要是虚函数?

​ 将有可能作为父类的析构函数设置为虚函数,可以保证当释放掉基类指针时同时释放掉子类的空间,防止内存泄漏。


为什么构造函数不能是虚函数?

​ 构造函数在进行调用时还不存在父类和子类的概念,因此不存在动态绑定的概念。


为什么静态函数不能是虚函数?

​ 静态成员函数是以类为单位的函数,与具体对象无关,虚函数是与对象动态绑定的。




www.cnblogs.com/mr-wid/arch…