C++學習之一:構造函數和析構函數

   今天我同事問我,析構函數裏什麼都不寫,那要它來幹什麼呢?咋一想彷佛是沒什麼做用哦,就是一個空函數而已。後來想想不對。下面請讓我細細道來。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 }
View Code

 第7行的輸出結果是「C6F7AF」,而PrintHello函數的調用仍然是能夠的。

補充一下構造函數和析構函數的特色(摘自互聯網)。

構造函數 
(1)構造方法的方法名必須與類名相同。 
(2)構造方法沒有返回類型,也不能定義爲void,在方法名前面不聲明方法類型。 
(3)構造方法的主要做用是完成對象的初始化工做,它可以把定義對象時的參數傳給對象的域。 
(4)構造方法不能由編程人員調用,而要系統調用。 
(5)一個類能夠定義多個構造方法,若是在定義類時沒有定義構造方法,則編譯系統會自動插入一個無參數的默認構造器,這個構造器不執行任何代碼。 
(6)構造方法能夠重載,以參數的個數,類型,或排列順序區分

析構函數析構函數(destructor)也是一種成員函數,但它的做用與構造函數相反,
用來在系統釋放對象前作一些清理工做,如利用delete運算符釋放臨時分配的內存,
清零某些內存單元等.當一個對象生存期結束時,系統會自動調用該對象所屬類的析構函數; 

構造函數的名稱與類名相同,而析構函數的名稱必須在類名前加上"~"符號;

注意,構造函數和析構函數不能指定任何返回值類型,包括void返回類型; 

相關文章
相關標籤/搜索