C++:this指针和构造与析构的运用--1https://developer.aliyun.com/article/1424570?spm=a2c6h.13148508.setting.15.214f4f0eDzCQ1n
三,析构函数
析构函数:在销毁对象前,自动的完成清理工作,即在对象生命周期结束时将会清理空间资源。
特征:
1,析构函数的函数名是在类名前加上一个符号 ‘~’。
2,析构函数无参数且无返回值类型。
3,一个类中只能有一个析构函数,若没有自己定义,系统会自动生成一个默认析构函数。
4,在对象的生命周期结束时,系统将会自动调用析构函数。
注意:
1,由于析构函数没有参数,因此此函数不支持重载。
2,析构函数的权限设置跟构造函数的设置一样,一般都要设置为public。
3,类的析构函数调用一般按照构造函数调用的相反顺序进行调用,即倒序,但要注意static和全局变量的情况,存储静态区的将会在整个代码结束后才会调用。
4,默认析构函数跟默认构造函数一样,只对自定义类型成员处理,即自定义类型成员会去调用他的析构函数,而内置类型成员不做任何处理。
5,析构函数只能释放该对象本身所占用的空间,但对象内部所指向的内存空间或其它空间没有被释放,最终将会造成内存泄漏。
6,由第2条可知,如果类中没有申请资源时,析构函数可不写,直接使用编译器生成的默认析构函数即可。因为当对象的生命周期结束后空间就自动销毁了,也就还给操作系统了,但是如果在堆区中开辟了空间就需要在析构函数中自己完成清理工作。
样例示范一:
class Time { public: //首先权限设置必须为public,否则结束时将不可调用,将会出错 //其次,类对象的成员中没有在堆区中占用空间,可不写析构函数 ~Time() { cout << "~Time()" << endl; } private: int _hour; int _minute; int _second; };
样例示范二:
class Stack { public: Stack(size_t capacity = 3) { _array = (int*)malloc(sizeof(int) * capacity); _capacity = capacity; _size = 0; } void Push(int data) { _array[_size] = data; _size++; } //首先权限要设置为public //动态开辟空间,需要在析构函数中释放动态空间 ~Stack()//析构函数中不能有参数 { if (_array) { free(_array); _array = NULL; _capacity = 0; _size = 0; } } private: int* _array; int _capacity; int _size; };
C++:this指针和构造与析构的运用--3https://developer.aliyun.com/article/1424578?spm=a2c6h.13148508.setting.33.214f4f0eDzCQ1n