和一卡通一樣做巡更的網(wǎng)站有哪些友情鏈接交換軟件
前言
這篇文章我們來學(xué)習(xí)默認(rèn)成員函數(shù)中的析構(gòu)函數(shù)
概念
析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對(duì)對(duì)象本身的銷毀,局部對(duì)象銷毀工作是由編譯器完成的。而對(duì)象在銷毀時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成對(duì)象中資源的清理工作。
特性
析構(gòu)函數(shù)是特殊的成員函數(shù),其特征如下:
- 析構(gòu)函數(shù)名是在類名前加上字符 ~。
- 無參數(shù)無返回值類型。
- 一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。若未顯式定義,系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù)。注意:析構(gòu)函數(shù)不能重載
- 對(duì)象生命周期結(jié)束時(shí),C++編譯系統(tǒng)系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù) (析構(gòu)順序:先銷毀局部成員 后定義先銷毀 最后銷毀全局)
下面展示關(guān)于棧的釋放的兩種方式
typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 3){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (NULL == _array){perror("malloc申請(qǐng)空間失敗!!!");return;}_capacity = capacity;_size = 0;}void Push(DataType data){// CheckCapacity();_array[_size] = data;_size++;}// 其他方法...~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;int _capacity;int _size;
};
void TestStack()
{Stack s;s.Push(1);s.Push(2);
}
- 關(guān)于編譯器自動(dòng)生成的析構(gòu)函數(shù),是否會(huì)完成一些事情呢?下面的程序我們會(huì)看到,編譯器生成的默認(rèn)析構(gòu)函數(shù),對(duì)自定類型成員調(diào)用它的析構(gòu)函數(shù), 內(nèi)置類型成員不做處理
class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本類型(內(nèi)置類型)int _year = 1970;int _month = 1;int _day = 1;// 自定義類型Time _t;
};
int main()
{Date d;return 0;
}
// 程序運(yùn)行結(jié)束后輸出:~Time()
// 注意:創(chuàng)建哪個(gè)類的對(duì)象則調(diào)用該類的析構(gòu)函數(shù),銷毀那個(gè)類的對(duì)象則調(diào)用該類的析構(gòu)函數(shù)
- 如果類中沒有申請(qǐng)資源時(shí),析構(gòu)函數(shù)可以不寫,直接使用編譯器生成的默認(rèn)析構(gòu)函數(shù),比如Date類;有資源申請(qǐng)時(shí),一定要寫,否則會(huì)造成資源泄漏,比如Stack類。
結(jié)語
對(duì)于析構(gòu)函數(shù)的學(xué)習(xí)就到這里 我們下篇文章見 希望你有所收獲~