九、構造與析構

C++中的構造函數


如何給對象進行初始化?
一般而言所有的對象都需要一個確定的初始狀態
解決方案
  爲每個類都提供一個public的initialize函數
  對象創建後立即調用initialize函數進行初始化
  (插入9-1.cpp)
  
  上述解決方案initialize只是一個普通的函數,必須顯示的調用
  一旦由於失誤的原因,對象沒有初始化,那麼結果將是不確定的
     沒有初始化的對象,其內部成員變量的值是不確定的
     (插入9-2.cpp)


  C++中的類可以定義與類名相同的特殊成員函數
  這種與類名相同的成員函數叫做構造函數
  構造函數在定義時可以有參數,但是沒有任何返回類型的聲明
  
構造函數的調用
  一般情況下C++編譯器會自動調用構造函數
  在一些情況下則需要手動調用構造函數
  (插入9-3.cpp)


成員函數的重載
  類的成員函數和普通函數一樣可以進行重載,並遵守相同的重載規則
  (插入9-4.cpp)
  
兩個特殊的構造函數
   沒有參數的構造函數(默認構造函數)
       當類中沒有定義構造函數時,編譯器默認提供一個無參構造函數,並且其函數體爲空
   const引用的構造函數(拷貝構造函數)(實質是個重載的構造函數而已)
        當類中沒有定義拷貝構造函數時,編譯器默認提供一個拷貝構造函數,簡單的進行成員變量的值複製。
  (插入9-5.cpp)(插入9-6.cpp)


  
數組類的創建
    (插入9-7.cpp)

思考:可以直接調用構造函數嗎?如果可以,直接調用構造函數會有什麼情況發生?
解答:可以直接調用構造函數,直接調用構造函數將得到一個臨時對象
(插入10-5.cpp)

      因爲構造函數只能被編譯器自動或者在定義時調用。


C++中的類可以使用其他類定義成員變量
   如何給對象成員進行初始化?
   (插入10-1.cpp)
   C++中提供了初始化列表對成員變量進行初始化
   語法規則:
       Construrtor::Cons ():m1(v1),m2(v2),m3(v3)
  {
  }
   注意:
       成員變量的初始化順序與聲明順序相關,與在初始化列表中的順序無關
  初始化列表先與構造函數的函數體執行


插曲:
  類中的const成員變量是肯定有被分配空間的
  類中的const成員變量只是一個只讀變量
      編譯器無法直接得到const成員變量的初始值,因此無法進入符號表成爲真正意義上的常量
  初始化與賦值不同
      初始化是用已經存在的對象或值對正在創建的對象進行初值設置
 賦值是用已經存在的對象或者只對已經存在的對象進行值設置
 
    區別:
 初始化:被初始化的對象正在創建
 賦值:被賦值的對象已經存在


C++中的析構函數:
 
如何清理被銷燬的對象?


解決方案
   爲每個類提供一個public的destroy函數
   對象不在被需要時立即手工調用destroy函數進行清理
   
   destroy函數只是一個普通的函數,必須顯示的調用
   如果對象銷燬前沒有做清理,那麼狠可能造成資源泄露
      在構造函數中申請的資源,需要在對象銷燬前釋放
 
   C++中的類可以定義一個特殊的成員函數清理對象
   這個特殊的成員函數叫做析構函數
       定義:~ClassName()
   析構函數沒有參數也沒有任何返回類型的聲明
   析構函數在對象銷燬時自動調用
   (插入10-2.cpp)


Array類的進化
    (插入10-3.cpp)


構造函數與析構函數的調用秩序
  當類中有成員變量是其他類的對象時
    首先調用成員變量的析構函數
      調用順序與聲明順序相同
     之後調用自身類的構造函數
  析構函數的調用秩序與對應的構造函數調用秩序相反  
    (插入10-4.cpp)
  


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