今天我同事問我,析構函數裏什麼都不寫,那要它來幹什麼呢?咋一想彷佛是沒什麼做用哦,就是一個空函數而已。後來想想不對。下面請讓我細細道來。ios
首先說一下對象的生命週期。對象在聲明或new時被建立,在離開做用域時被銷燬。在建立時,調用自身的構造函數;在銷燬時調用析構函數。編程
因此有時候會有這樣的錯誤的認識:對象是調用構造函數建立的,在調用析構函數時被銷燬的。這種想法也就是前文提到的。ide
實際上,對象建立的過程是這樣的:函數
1.根據類的大小分配一塊內存this
2.調用構造函數對這塊內存進行初期化spa
對象銷燬的過程是這樣的:code
1.調用析構函數執行清理工做對象
2.銷燬內存blog
因此對象建立與構造函數無關,對象銷燬時與析構函數無關(假設,構造函數與析構函數都承諾不拋出異常)。生命週期
爲了驗證上面所述來看一個例子。
1 using namespace std; 2 #include <iostream> 3 4 class Foo{ 5 public: 6 Foo(){ 7 cout << &(*this) << endl; 8 } 9 ~Foo(){ 10 } 11 void PrintHello(){ 12 cout<< "hello"<<endl; 13 } 14 }; 15 void main(){ 16 17 Foo foo; 18 foo.~Foo(); 19 foo.PrintHello(); 20 21 }
第7行的輸出結果是「C6F7AF」,而PrintHello函數的調用仍然是能夠的。
補充一下構造函數和析構函數的特色(摘自互聯網)。
構造函數
(1)構造方法的方法名必須與類名相同。
(2)構造方法沒有返回類型,也不能定義爲void,在方法名前面不聲明方法類型。
(3)構造方法的主要做用是完成對象的初始化工做,它可以把定義對象時的參數傳給對象的域。
(4)構造方法不能由編程人員調用,而要系統調用。
(5)一個類能夠定義多個構造方法,若是在定義類時沒有定義構造方法,則編譯系統會自動插入一個無參數的默認構造器,這個構造器不執行任何代碼。
(6)構造方法能夠重載,以參數的個數,類型,或排列順序區分
析構函數析構函數(destructor)也是一種成員函數,但它的做用與構造函數相反,
用來在系統釋放對象前作一些清理工做,如利用delete運算符釋放臨時分配的內存,
清零某些內存單元等.當一個對象生存期結束時,系統會自動調用該對象所屬類的析構函數;
構造函數的名稱與類名相同,而析構函數的名稱必須在類名前加上"~"符號;
注意,構造函數和析構函數不能指定任何返回值類型,包括void返回類型;