EasyC++,析構(gòu)函數(shù)
大家好,我是梁唐。
析構(gòu)函數(shù)
當(dāng)我們使用構(gòu)造函數(shù)創(chuàng)建對(duì)象之后,程序負(fù)責(zé)跟蹤對(duì)象,直到對(duì)象過期位置。
對(duì)象過期時(shí),程序會(huì)自動(dòng)調(diào)用一個(gè)特殊的成員函數(shù),這個(gè)成員函數(shù)就叫做析構(gòu)函數(shù)。析構(gòu)函數(shù)這個(gè)翻譯有一些隱晦,它的英文是deconstructor,我個(gè)人感覺翻譯成銷毀函數(shù)更確切一些。
也就是說當(dāng)對(duì)象不再使用,即將被銷毀的時(shí)候會(huì)調(diào)用析構(gòu)函數(shù)。如果我們構(gòu)造函數(shù)當(dāng)中創(chuàng)建的都是存儲(chǔ)持續(xù)性的變量,也就是不是使用new創(chuàng)建的對(duì)象。這些對(duì)象會(huì)自動(dòng)銷毀,并不需要析構(gòu)函數(shù)執(zhí)行什么邏輯。如果構(gòu)造函數(shù)當(dāng)中使用了new動(dòng)態(tài)分配了內(nèi)存,那么需要在析構(gòu)函數(shù)當(dāng)中添加對(duì)應(yīng)的delete語句,將內(nèi)存釋放。
比如這個(gè)例子:
- class Algo {
- public:
- Algo(const char* name) {
- name_ = new char[strlen(name)+1];
- strcpy(name_, name);
- }
- private:
- char *name_;
- }
在這個(gè)例子當(dāng)中,Algo類當(dāng)中的name_變量是通過new動(dòng)態(tài)分配的,那么當(dāng)Algo的實(shí)例銷毀的時(shí)候,需要我們?cè)谖鰳?gòu)函數(shù)當(dāng)中手動(dòng)執(zhí)行delete的邏輯。
析構(gòu)函數(shù)和構(gòu)造函數(shù)幾乎完全一樣,只在類名前加上~。析構(gòu)函數(shù)也可以沒有返回值和聲明類型,并且析構(gòu)函數(shù)沒有參數(shù)。
加上析構(gòu)函數(shù)之后,上面的例子是這樣的:
- class Algo {
- public:
- Algo(const char* name) {
- name_ = new char[strlen(name)+1];
- strcpy(name_, name);
- }
- ~Algo() {
- delete []name_;
- }
- private:
- char *name_;
- }
有一點(diǎn)需要注意,析構(gòu)函數(shù)調(diào)用應(yīng)該是由編譯器決定,如果創(chuàng)建的是靜態(tài)存儲(chǔ)類對(duì)象,則析構(gòu)函數(shù)在程序結(jié)束時(shí)自動(dòng)調(diào)用,如果創(chuàng)建的是自動(dòng)存儲(chǔ)類對(duì)象,析構(gòu)函數(shù)會(huì)在程序執(zhí)行完代碼塊時(shí)被自動(dòng)調(diào)用。如果是通過new創(chuàng)建的,那么則在使用delete時(shí)被調(diào)用。一般我們不會(huì)手動(dòng)調(diào)用析構(gòu)函數(shù)。
由于類對(duì)象過期時(shí)析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用,因此必須有一個(gè)析構(gòu)函數(shù)。如果程序員沒有提供析構(gòu)函數(shù),那么編譯器將隱式地聲明一個(gè)默認(rèn)析構(gòu)函數(shù)。