C++析构函数学习笔记

本博文源于C++基础,析构函数是在用于创建对象时完成数据成员的初始化,与之对应,对象生命周期结束前应该完成对象资源的清理,这个工作由析构函数完成。比如创建对象时为数据成员开辟空间,会通过析构函数在对象的生命周期结束前进行释放。 定义析构函数应满足以下要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。博文就以Car初始化创建内存,在析构函数里进行释放为例子,体验一把析构函数的使用规则。

文章目录

1. 构函数常用格式

类名: ~析构函数()
{
函数体
}

2. 案例:Car析构函数释放对象资源

Car内定义了指针数据成员m_pCarName,用来记录存有汽车名称空间的地址,通过构造函数Car(char *con_pcarname,int con_seats)进行初始化,应通过new开辟一段空间存放汽车名称,空间地址记录在m_pCarName中,从运行结果来看,对象生命周期结束时析构函数会被自动调用,完成了资源清理工作。
当然还有一个有趣的现象就是:析构函数的调用顺序和构造函数的调用顺序相反,后创建的对象先析构,先创建的对象后析构。

#include<iostream>
#include<cstring>
using namespace std;


class Car {
public:
    Car();//无参构造
    Car(char *con_pcarname,int con_seats);//有参构造
    ~Car();//析构函数声明
    char *get_carname();
    int get_seats();
private:
    char *m_pCarName;
    int m_nSeats;
};
Car::Car()//定义无参构造
{
    cout << "Car constructor!" << endl;
    m_pCarName = nullptr;//初始值为nullptr,值为0
    m_nSeats = 4;
}
Car::Car(char *con_pcarname,int con_seats)//定义有参函数
{
    int len = strlen(con_pcarname)+ 1;
    cout << "Car constructor with param,car name:" << con_pcarname << endl;
    m_pCarName = new char[len];//数据成员m_pCarName指向新开辟的空间
    strcpy_s(m_pCarName,len,con_pcarname);
    m_nSeats = con_seats;
}

Car::~Car() //定义析构函数
{
    static int i = 0;
    cout << "Car destructor,car name:" << m_pCarName << endl;
    if(m_pCarName)//释放m_pCarName指向空间
        delete[] m_pCarName;
    if(i==1)
        system("pause");
    i++;
}

char *Car::get_carname() {
    return m_pCarName;//获取m_pCarName属性值
}

int Car::get_seats() {
    return m_nSeats;//获取m_nSeats属性值
}
int main()
{
    Car mynewcar("my car",4);//创建对象
    Car tomcar("tom car",7);//创建对象

    cout << "my car name:" << mynewcar.get_carname() << endl;
    cout << "tom car name:" << tomcar.get_carname() << endl;
    return 0;

}

C++析构函数学习笔记

3. 总结&读者收获

通过本博文的学习,读者可以轻松收获析构函数的要求:1、析构函数的名称是在构造函数名称之前添加"~".2、析构函数没有参数。3、析构函数中不能通过return语句返回一个值。4、一个雷中只能有一个析构函数,不可重载。当然还有一个有趣的现象就是先创建的对象,后析构。

上一篇:实验四 继承


下一篇:【渝粤题库】国家开放大学2021春3896人文英语1题目