学Qt时候涉及到了一个知识点,析构函数。
讲到树,树的创建是由上到下,树的内存释放是由下到上,然后用一个析构函数做表示,听完后很懵,不知道说析构函数到底是什么,真有些点记不清楚了,所以今天来复习复习。
析构函数和构造函数
对象的初始化和清理也是两个非常重要的安全问题
1.一个对象或者变量没有初始化状态,对其使用后果是未知
2.同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题
c++利用了构造函数和析构函数解决了上述问题,这两个函数会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作
构造函数语法
类名(){}
1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象时候会自动调用构造,无需手动调用,而且只会调用一次
析构函数语法
~类名(){}
1.构造函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号~
3.构造函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次
加上代码方便理解
#include<iostream>
using namespace std;
//构造函数和析构函数--实现-->初始化和清理
//构造函数语法:类名(){} 析构函数语法:~类名(){}
//对象的初始化和清理
class Person{
public:
//1.1构造函数
//没有返回值 不用写void
//函数名 与类名相同
//构造函数可以有参数,可以发生重载
//创建对象时候,构造函数会自动调用,而且只调用一次
Person(){
cout<<"Person的构造函数调用"<<endl;
}
//2.析构函数,进行清理的操作
//没有返回值 不用写void
//函数名 与类名相同,在名称前加一个~
//析构函数不可以有参数的,不可以发生重载
//对象在销毁前 会自动调用析构函数,而且只会调用一次
~Person(){
cout<<"Person的析构函数调用"<<endl;
}
};
//构造和析构都是必须有的,如果我们自己不提供,编译器会提供一个空实现的构造和析构
void test01(){//构造对象 并没有调用
Person p;//栈上的数据 ,test01执行完,释放这个对象
}
int main(){
test01(); //p在上面的话,调用完函数后,就被析构了,所以出现了两个
Person p;//也会调用,但只会调构造,底下的system直接让程序结束 其实也会调析构
system("pause");
return 0;
}