什么是析構(gòu)函數(shù)
析構(gòu)函數(shù)是類的一個(gè)成員函數(shù)荆永,名字由波浪號(hào)接類名構(gòu)成鹤盒,沒(méi)有返回值,不接受參數(shù)褐隆,一個(gè)類只有一個(gè)析構(gòu)函數(shù)污它。當(dāng)一個(gè)類未定義自己的析構(gòu)函數(shù)時(shí),編譯器會(huì)為它定義一個(gè)合成的析構(gòu)函數(shù)。
析構(gòu)函數(shù)完成什么工作
在構(gòu)造函數(shù)中衫贬,成員的初始化時(shí)在函數(shù)體執(zhí)行前完成的德澈,且按照他們?cè)陬愔械捻樞蜻M(jìn)行初始化。在析構(gòu)函數(shù)中固惯,首先執(zhí)行函數(shù)體梆造,然后按照初始化順序的逆序銷毀成員。
析構(gòu)函數(shù)銷毀類類型成員時(shí)執(zhí)行成員自己的析構(gòu)函數(shù)缝呕,內(nèi)置類型(包括指針)則什么也不做澳窑,智能指針是類類型,會(huì)被自動(dòng)銷毀供常。
析構(gòu)函數(shù)什么時(shí)候被調(diào)用
- 變量在離開(kāi)其作用域時(shí)被銷毀摊聋。
- 當(dāng)一個(gè)對(duì)象被銷毀時(shí),其成員被銷毀栈暇。
- 容易起被銷毀時(shí)麻裁,其元素也被銷毀。
- 對(duì)于動(dòng)態(tài)分配的對(duì)象源祈,當(dāng)對(duì)指向它的指針使用delete運(yùn)算符時(shí)被銷毀煎源。
- 對(duì)于臨時(shí)對(duì)象,創(chuàng)建它的完整表達(dá)式結(jié)束時(shí)被銷毀香缺。
派生類在銷毀時(shí)手销,派生類的析構(gòu)函數(shù)首先執(zhí)行,然后是基類的析構(gòu)函數(shù)图张,以此類推锋拖,沿著繼承體系的反方向直至最后。
虛析構(gòu)函數(shù)
在執(zhí)行析構(gòu)函數(shù)時(shí)祸轮,如果指針指向的對(duì)象的靜態(tài)類型與動(dòng)態(tài)類型不符兽埃,例如一個(gè)指向基類對(duì)象的指針實(shí)際上指向了一個(gè)派生類對(duì)象,那么只有基類的析構(gòu)函數(shù)會(huì)被執(zhí)行适袜,為了確保執(zhí)行正確的析構(gòu)函數(shù)柄错,可以將基類中的析構(gòu)函數(shù)聲明為虛函數(shù),一個(gè)基類總是需要虛析構(gòu)函數(shù)苦酱。虛析構(gòu)函數(shù)將阻止合成移動(dòng)操作售貌。
class Person
{
public:
const char* name_;
Person(const char* name):name_(name) {};
~Person()
{
std::cout << "invoke person deinit" << std::endl;
}
};
class Worker :public Person
{
public:
Worker() :Person("work man"){};
~Worker()
{
std::cout << "invoke worker deinit" << std::endl;
}
};
int main(void)
{
Person* person = new Worker();
std::cout << person->name_ << std::endl;
delete person;
system("pause");
return 0;
}