C++特性之构造函数,析构函数和虚析构函数
1.构造函数
一种特殊的成员函数,在创建对象时自动调用。常用于初始化成员。
示例
class MyClass {
public:MyClass() { // 默认构造函数data = 0;ptr = nullptr;}
private:int data;int* ptr;
};MyClass obj1; // 调用默认构造函数
2.析构函数
一种特殊的成员函数,在对象被销毁时自动调用,常用于清理资源如开辟的空间等。
class MyClass {
public:~MyClass() { // 析构函数}
private:int data;int* ptr;
};int main(){MyClass m1;}//调用析构函数
核心思想:利用构造函数获取资源(内存、文件、网络连接等),利用析构函数释放资源。这就是著名的RAII(Resource Acquisition Is Initialization) 资源管理 idiom,是编写安全、无泄漏的C++代码的关键。
3.虚析构函数
作用:确保通过基类指针删除派生类对象时,能够正确调用派生类的析构函数,从而避免资源泄漏。
示例
#include <iostream>class Base {
public:Base() { std::cout << "Base Constructor\n"; }virtual ~Base() { std::cout << "Base Destructor\n"; } // 现在是虚函数!
};class Derived : public Base {
public:Derived() { std::cout << "Derived Constructor\n"; }~Derived() override { std::cout << "Derived Destructor\n"; } // 最好加上override
};int main() {Base* ptr = new Derived();delete ptr; // 现在会发生什么?return 0;
}
Base Constructor
Derived Constructor
Derived Destructor // 派生类析构函数被调用
Base Destructor // 基类析构函数被调用
结果:所有资源都被正确释放,没有任何泄漏。
核心要点:如果你设计的一个类打算被继承并通过基类指针使用,那么给它一个虚析构函数。这是一个简单但至关重要的规则,可以避免许多难以调试的内存和资源泄漏问题。