本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第4章,第4.3節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
c++面向對象高效程式設計(第2版)
c++提供類的析構函數專門處理無用單元收集,但是,這并不意味着無用單元收集隻發生在析構函數中。實際上,某些其他成員函數也必須考慮無用單元收集。
類的析構函數給予對象最後一次機會釋放它所獲得的所有資源。在退出某作用域之前,由語言自動為在該作用域中建立的自動(基于棧)對象調用析構函數。此時,對象即将被銷毀(也就是說,被對象占用的記憶體即将被系統回收)。一旦析構函數完成,對象将徹底地消失。
删除(使用delete操作符)指向某對象的指針時,将通過該對象調用對象所屬類的析構函數。
// 第一個構造函數
tperson::tperson(const char birthdate[])
: _ssn(0), _name(0), _birthdate(birthdate), _address(0)
{ / 構造函數體無代碼 / }
char strdup (const char src) // 輔助函數
{
char* ptr = new char[strlen(src)+1];
strcpy(ptr, src);
return ptr;
}
// 第二個構造函數
tperson::tperson(const char thename[], const char theaddress[],
unsigned long thessn, const char thebirthdate[])
: _ssn(thessn), _birthdate(thebirthdate)
{ // 初始化_name、_address等
_name = (thename ? strdup(thename) : 0);
_address = (theaddress ? strdup(theaddress) : 0);
}<code>`</code>
我們已在堆(heap)上為待儲存人名中的字元配置設定記憶體。析構函數負責釋放這些記憶體。
main()
tperson john(“11-23-45”);
// ...
john.setname(“john wayne”);
對象john隻有出生日期,沒有姓名。接下來,我們使用setname成員函數設定john的姓名。setname成員函數用來做什麼?以下是它的實作代碼: