看到這樣一個例子:
class B
{
private:
int data;
public:
B(){
cout<<"default constructor"<<endl;
};
~B(){
cout<<"destructed"<<endl;
};
B(int i):data(i){
cout<<"destructed by parameter:"<<data<<endl;
};
B play(B b){
return b;
};
};
int main(int argc,char* argv[])
{
B play(5);
system("pause");
return 0;
}
運行後輸出爲:
destructed by parameter: 5
destructed
那麼都有哪些情況會調用析構函數呢?
1. 當用new運算符動態地建立了一個對象,必須顯式用delete運算符來釋放該對象(以免造成內存泄露),此時會調用該對象的析構函數。
另外,個人理解,new跟delete必須同時出現,new開闢新空間,delete釋放空間,否則會造成內存泄露。
2.如果在一個函數中定義了一個對象(它是自動局部對象),當這個函數被調用結束時,對象應該釋放,在對象釋放前自動執行析構函數。
3.static局部對象在函數調用結束時對象並不釋放,因此也不調用析構函數,只在main函數結束或調用exit函數結束程序時,才調用static局部對象的析構函數。
4.如果定義了一個全局對象,則在程序的流程離開其作用域時(如main函數結束或調用exit函數) 時,調用該全局對象的析構函數。
析構函數的作用並不是刪除對象,而是在撤銷對象佔用的內存之前完成一些清理工作,使這部分內存可以被程序分配給新對象使用。程序設計者事先設計好析構函數,以完成所需的功能,只要對象的生命期結束,程序就自動執行析構函數來完成這些工作。
看了一組簡單的例子,簡單容易理解,可以看看:http://www.cnblogs.com/daoluanxiaozi/archive/2011/12/09/2281796.html
析構函數的作用並不僅限於釋放資源方面,它還可以被用來執行“用戶希望在最後一次使用對象之後所執行的任何操作”,例如輸出有關的信息。這裏說的用戶是指類的設計者,因爲,析構函數是在聲明類的時候定義的。也就是說,析構函數可以完成類的設計者所指定的任何操作。
注意:析構函數不返回任何值,沒有函數類型,也沒有函數參數。因此它不能被重載。一個類可以有多個構造函數,但只能有一個析構函數。