構造函數與拷貝構造函數

 

  1. 構造函數

構造函數、析構函數與賦值函數是每個類最基本的函數。

對於任意一個類A,如果不想編寫上述函數,C++編譯器將自動爲A 產生四個缺省的函數,例如:

1 A(void); // 缺省的無參數構造函數2 A(const A &a); // 缺省的拷貝構造函數3 ~A(void); // 缺省的析構函數4 A & operate =(const A &a); // 缺省的賦值函數

默認構造函數與默認析構函數僅負責對象的創建和銷燬,不做對象的初始化和資源的清理。

C++中通過構造函數確保對象的初始化,如果類存在構造函數,編譯器會在創建對象的時候自動調用該函數。

構造函數特徵:

  • 與類同名
  • 沒有返回值(與析構函數一致)
  • 構造函數可以被重載,由實參決定調用哪個構造函數
 1 class A 2 { 3       public: 4           int i,j; 5            6           A(): i(0), j(0) {}; //構造函數一:使用構造函數初始化列表 7           A(int iI, int iJ); //構造函數二:使用參數賦值 8 }; 9  10 A::A(int iI, int iJ) {11       i = iI;12       j = iJ;13 }

構造函數一使用初始化列表對數據成員進行初始化,這在某些情況下是唯一選擇:

對類中const和引用類型對象的初始化,只能使用初始化列表,不能賦值操作

 1 class A 2 { 3     public: 4         A(int ii); 5     private: 6         int i; 7         const int ci; 8         int &ri; 9 };10 11 A::A(int ii)12 {13     i = ii;   //ok14     ci = ii; //const對象不可以賦值15     ri = i;  //賦值給ri但對象未綁定16 }17 18 //正確寫法如下:19 A::A(int ii) : i(ii), ci(i), ri(ii){}

 

 

默認構造函數(default constructor)就是在沒有顯式提供初始化式時調用的構造函數。它由不帶參數的構造函數,或者爲所有的形參提供默認實參的構造函數定義。如果定義某個類的變量時沒有提供初始化式就會使用默認構造函數。

     2.拷貝構造函數

     特徵:

  • 只有單個形參,形參爲對本類類型對象的引用(用const修飾)  

     (1)如果沒有定義拷貝構造函數,編譯器會合成拷貝構造函數

      函數行爲是逐個成員進行初始化,然後將新對象初始化爲原對象的副本。數組成員是例外,合成拷貝構造函數會拷貝整個數組。

      (2)自定義拷貝構造函數

       A(const A&);

      大多數類應定義拷貝構造函數和默認構造函數。

     (3)禁止拷貝

      如果一個類需要禁止賦值,並需顯式地聲明拷貝構造函數爲private,這樣就不允許用戶代碼對該類類型的對象進行復制。

     但類的友元和成員仍然可以進行復制,也需要禁止的話,就需要聲明一個拷貝構造函數爲private且對它不進行定義。

轉自:天翼空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章