C++析构函数

本文介绍了C++中的析构函数,它在对象销毁时自动调用,用于释放资源。析构函数无返回值,无参数,且不可重载。在示例中展示了如何定义和使用析构函数,以及其在内存管理中的作用。
部署运行你感兴趣的模型镜像

C++析构函数

C++析构函数

在创建对象的时候系统会自动调用构造函数,在对象需要被销毁的时候同样系统会自动调用一个函数,这个函数被称之为析构函数。
析构函数就是用于回收创建对象时所消耗的各种资源。与构造函数类似,析构函数也是一个成员函数。析构函数与普通成员函数相比,有如下特征:
无返回值;
没有参数,不能被重载,因此一个类也只能含有一个析构函数;
函数名必须为“类名”的形式,符号“”与类名之间可以有空格。

#include <iostream>

using namespace std;

class book
{
public:
    book(){}
    book(book &b);
    book(char* a, double p = 5.0);
    ~book();
    void display();
private:
    double price;
    char *title;
};

book::book(book &b)
{
    price = b.price;
    title = b.title;
}

book::book(char* a, double p)
{
    title = a;
    price = p;
}

book::~book()
{
    cout<<"~book " <<endl;
    //delete p;
    //delete[] p;
}

void book::display()
{
    if(title == NULL)
    {
        cout<<"The title null " <<endl;
    }
    else
    {
        cout<<"The price of "<<title<<" is $"<<price<<endl;
    }
}

int main()
{
    cout << "Hello World!" << endl;

//    book b;
//    b.display();

    book b2("books");
    b2.display();

    book b3(b2);
    b3.display();

    return 0;
}
book::~book()
{
    cout<<"~book " <<endl;
    //delete p;
    //delete[] p;
}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### C++ 析构函数的使用方法 析构函数是在对象生命周期结束时自动调用的一个特殊成员函数,用于执行清理操作。它的功能主要包括释放动态分配的内存、关闭打开的文件以及释放其他资源等[^3]。 #### 定义方式 析构函数的名字由波浪号 `~` 加上类名组成,不接受任何参数也不返回任何值。例如: ```cpp class MyClass { public: ~MyClass(); // 析构函数声明 }; // 析构函数定义 MyClass::~MyClass() { // 清理逻辑 } ``` 如果未显式定义析构函数,则编译器会自动生成一个默认析构函数[^1]。默认析构函数通常适用于简单的数据结构,但对于复杂的数据结构(如包含动态分配的内存),则需要手动定义以确保资源被正确释放。 --- ### 默认析构函数与用户定义析构函数的区别 - **默认析构函数**: 编译器生成的默认析构函数仅负责销毁类中的非静态成员变量,并不会处理额外的清理任务。它适合于那些不需要特别清理工作的简单类[^4]。 - **用户定义析构函数**: 当类中存在动态分配的资源(如堆内存、文件句柄或其他外部资源)时,必须显式定义析构函数来完成这些资源的释放。例如: ```cpp class ResourceHandler { private: int* data; public: ResourceHandler(int size) : data(new int[size]) {} // 动态分配内存 ~ResourceHandler() { delete[] data; } // 显式释放内存 }; ``` 在此例子中,如果没有显式的析构函数,`data` 所指向的堆内存将无法得到释放,从而引发内存泄漏问题。 --- ### 需要显式定义析构函数的情况 以下是几种常见的场景,其中需要显式定义析构函数而不是依赖默认版本: 1. 类中有动态分配的内存; 2. 类管理了某些外部资源(如文件流、数据库连接等); 3. 存在继承关系且基类拥有虚函数的情况下,为了支持多态行为,应将基类的析构函数声明为虚拟函数。 示例代码如下所示: ```cpp class Base { public: virtual ~Base() {} // 虚拟析构函数 }; class Derived : public Base { public: ~Derived() override {} // 派生类析构函数 }; ``` --- ### 私有析构函数的应用 有时出于设计需求,可能希望限制某个类的对象只能通过特定的方式创建或销毁。此时可以通过将析构函数设为私有并提供友元函数或者嵌套类来进行间接访问[^2]。然而需要注意的是,在这种模式下容易遇到一些潜在风险,比如内存泄漏和继承相关的问题。 --- ### 注意事项 编写析构函数时需注意以下几点以保障程序的安全性和效率: 1. **避免重复删除同一块内存**:多次调用 `delete` 或者错误地释放已经释放过的指针可能导致未定义行为。 2. **防止异常抛出**:由于析构函数本身不应该失败,因此在其内部尽量减少可能会触发异常的操作。 3. **考虑线程安全因素**:对于共享资源而言,析构过程中应当同步多个线程之间的交互以防竞争条件发生。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静思心远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值