📜  C++中的析构函数(1)

📅  最后修改于: 2023-12-03 14:39:58.572000             🧑  作者: Mango

C++中的析构函数

在C++中,析构函数是一种特殊的成员函数,用于清理对象的资源,当对象被销毁时自动调用。析构函数通常用于释放对象的动态分配的内存、关闭文件、网络连接等清理工作。

析构函数的语法

析构函数的函数名与类名相同,但前面要加上一个波浪号(~)作为前缀,没有参数和返回类型,也不需要手动调用。

以下是示例代码:

class MyClass {
public:
    MyClass() { // 构造函数
        std::cout << "MyClass被创建" << std::endl;
    }
    ~MyClass() { // 析构函数
        std::cout << "MyClass被销毁" << std::endl;
    }
};

int main() {
    MyClass obj; // 对象被创建
}

输出结果为:

MyClass被创建
MyClass被销毁

在上面的代码中,对象obj被创建后,在程序退出前自动销毁,析构函数也随之自动调用。输出结果中可以看到析构函数被调用了一次。

析构函数的调用时机

析构函数的调用时机与对象的创建方式有关。如果对象是被动态分配的(使用new关键字),则需要手动调用delete关键字来销毁对象,并触发析构函数的调用。示例代码如下:

MyClass* obj = new MyClass(); // 动态分配对象
delete obj; // 调用析构函数并释放内存

如果对象是被静态分配的(位于栈上),则在对象的生命周期结束时自动销毁,并触发析构函数的调用。示例代码如下:

void foo() {
    MyClass obj; // 静态分配对象
} // 对象在foo函数结束时销毁并调用析构函数
析构函数的继承规则

析构函数会被自动调用,且是先调用派生类的析构函数,再调用基类的析构函数。这是因为派生类继承了基类的成员和方法,必须先释放派生类自己的资源,再释放基类的资源。示例代码如下:

class MyBaseClass {
public:
    MyBaseClass() { // 基类的构造函数
        std::cout << "MyBaseClass被创建" << std::endl;
    }
    ~MyBaseClass() { // 基类的析构函数
        std::cout << "MyBaseClass被销毁" << std::endl;
    }
};

class MyDerivedClass : public MyBaseClass {
public:
    MyDerivedClass() { // 派生类的构造函数
        std::cout << "MyDerivedClass被创建" << std::endl;
    }
    ~MyDerivedClass() { // 派生类的析构函数
        std::cout << "MyDerivedClass被销毁" << std::endl;
    }
};

int main() {
    MyDerivedClass obj; // 对象被创建
}

输出结果为:

MyBaseClass被创建
MyDerivedClass被创建
MyDerivedClass被销毁
MyBaseClass被销毁

可以看出,在对象销毁时,先调用派生类的析构函数,再调用基类的析构函数。

注意事项

在析构函数中,一般不要抛出异常,因为在析构函数中抛出异常会导致程序异常终止。此外,当使用多态时,析构函数应该声明为虚函数,以便派生类能够正确地销毁。最后,需要注意析构函数如果没有必要,应该省略掉,因为编译器会自动生成默认的析构函数,假如自己手动编写,就可能存在重复定义的问题。

总结

在C++中,析构函数是一种用于清理对象资源的特殊成员函数,能够自动调用并释放对象的动态分配的内存、关闭文件、网络连接等资源。通过本篇文章的介绍,相信大家已经掌握了析构函数的语法、调用时机、继承规则等知识点,希望对大家的程序开发有所帮助。