構造函數與拷貝構造函數

 

  1. 構造函數

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

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

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

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

C++中經過構造函數確保對象的初始化,若是類存在構造函數,編譯器會在建立對象的時候自動調用該函數。spa

構造函數特徵:code

  • 與類同名
  • 沒有返回值(與析構函數一致)
  • 構造函數能夠被重載,由實參決定調用哪一個構造函數
 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和引用類型對象的初始化,只能使用初始化列表,不能賦值操做blog

 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)就是在沒有顯式提供初始化式時調用的構造函數。它由不帶參數的構造函數,或者爲全部的形參提供默認實參的構造函數定義。若是定義某個類的變量時沒有提供初始化式就會使用默認構造函數。ci

     2.拷貝構造函數資源

     特徵:
get

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

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

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

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

       A(const A&);

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

     (3)禁止拷貝

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

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

轉自:天翼空間

相關文章
相關標籤/搜索