析构函数
前言
构造函数是在类对象创建时就调用,一般的用途就是初始化对象。
而析构函数相反,它是在类的对象结束生命周期才自动执行,一般就是清理之类的,最常见就是释放掉new的空间
格式也挺特殊,是在类名前加一个~
全称:~类名(){}
正文
析构函数名也应与类名相同,只是在函数名前面加一个位取反符,例如stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。——百度
这个析构主要就是应对动态分配的内存,需要手动销毁,因为其它的成员变量该结束编译器会自动处理掉。
1 |
|
看到实例化一个类的时候他就会顺序执行构造函数和析构函数。
这样可能不够直观,因为就之创建了一个类,可以简单在main函数里输出点什么。
1 | int main(){ |
也就是说当这个程序即将结束时,它会自动调用类中的析构函数,释放掉该释放的东西,当然这里因为还没动态分配只是做个示范。
1 | class Box{ |
当类中声明了一个指针,然后在构造函数里动态分配内存,如果析构函数不执行delete。那么内存就会一直堆积下去。
因为虽然对象会自动释放,但是它释放的都是存在栈中的内存,这里的指针ch会释放,但是分配给它的100*4的内存不会主动释放。这块内存在正常情况下就不能被访问了。
然后前面构造函数有个default关键字保留,析构也能用。
1 | class Box{ |
当然效果都差不多,如果函数里要写东西自然就不用这种方式。
再次重复:=default 是c++11的特性,目的就是会自动生成函数体,在不需要写内容的时候效率更高。
结语
析构函数雀食没啥好讲的。
学到此处就是知道编译器会自动对类生成构造函数、副本构造函数、析构函数。
副本构造或者拷贝构造叫法都差不多~