析構函數的調用

看到這樣一個例子:

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

      析構函數的作用並不僅限於釋放資源方面,它還可以被用來執行“用戶希望在最後一次使用對象之後所執行的任何操作”,例如輸出有關的信息。這裏說的用戶是指類的設計者,因爲,析構函數是在聲明類的時候定義的。也就是說,析構函數可以完成類的設計者所指定的任何操作。

注意:析構函數不返回任何值,沒有函數類型,也沒有函數參數。因此它不能被重載。一個類可以有多個構造函數,但只能有一個析構函數。

        

發佈了23 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章