一、對象實例化
當我們創建一個對象的實例並初始化時,該對象的構造函數會被調用,而當該對象的生命周期結束時,該對象的析構函數會被調用。
例如,我們創建一個名為person的Person對象實例,代碼如下:
class Person{ public: Person() { std::cout << "構造函數調用" << std::endl; } ~Person() { std::cout << "析構函數調用" << std::endl; } }; int main(){ Person person; return 0; }
上述代碼中,當我們創建一個名為person的Person對象實例時,構造函數就會被調用,並輸出“構造函數調用”這句話,而當程序結束時,析構函數會被調用,並輸出“析構函數調用”這句話。
二、對象銷毀
對象在何時銷毀也會影響析構函數的調用,例如當對象是在函數內創建的時候,在函數結束的時候,對象會被銷毀,從而觸發析構函數的調用。
例如,我們將Person對象放到一個函數中去,代碼如下:
#include class Person{ public: Person() { std::cout << "構造函數調用" << std::endl; } ~Person() { std::cout << "析構函數調用" << std::endl; } }; void func(){ Person person; } int main(){ func(); return 0; }
上面的代碼中,當我們調用func函數時,person對象會在函數結束時被銷毀,從而觸發析構函數的調用,輸出“析構函數調用”這句話。
三、動態內存分配
C++允許在堆上(動態)分配內存,通過使用new和delete操作符來實現。當使用new操作符創建對象時,對象的構造函數會被調用,而當使用delete操作符來釋放對象的內存時,析構函數會被調用。
例如,我們動態分配了一個Person對象,並且之後將其釋放,代碼如下:
class Person{ public: Person() { std::cout << "構造函數調用" << std::endl; } ~Person() { std::cout << "析構函數調用" << std::endl; } }; int main(){ Person * person = new Person(); delete person; return 0; }
上述代碼中,我們使用new操作符動態創建了一個Person對象,並輸出“構造函數調用”,而當我們使用delete操作符銷毀對象時,析構函數就會被調用,從而輸出“析構函數調用”這句話。
四、異常
異常機制可以使程序更加健壯,但是在異常拋出時需要注意析構函數的調用。當異常被拋出時,系統將回收動態分配的內存,並調用相關對象的析構函數。
例如,我們在上面的動態內存分配示例中,使用try-catch語句包含delete操作符,並在其中拋出了一個異常,代碼如下:
class Person{ public: Person() { std::cout << "構造函數調用" << std::endl; } ~Person() { std::cout << "析構函數調用" << std::endl; } }; int main(){ Person * person = new Person(); try{ delete person; throw "拋出異常"; } catch (const char* msg) { std::cerr << msg << std::endl; } return 0; }
在上述代碼中,當我們拋出異常時,系統將回收動態分配的內存,並且調用相關對象的析構函數,從而輸出“析構函數調用”這句話。
五、類繼承
當類中存在繼承關係時,子類的析構函數會在父類的析構函數之後被調用。
例如,我們創建一個名為Student的子類並繼承自Person類,代碼如下:
class Person{ public: Person() { std::cout << "Person構造函數調用" << std::endl; } virtual ~Person() { std::cout << "Person析構函數調用" << std::endl; } }; class Student : public Person { public: Student() { std::cout << "Student構造函數調用" << std::endl; } ~Student() { std::cout << "Student析構函數調用" << std::endl; } }; int main(){ Student student; return 0; }
上述代碼中,在創建Student對象時輸出“Person構造函數調用”,並在類繼承中Student類的析構函數被Person類的析構函數之後被調用,從而輸出“Student析構函數調用”和“Person析構函數調用”這兩句話。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/253999.html