- 構造函數
構造函數、析構函數與賦值函數是每個類最基本的函數。
對於任意一個類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且對它不進行定義。
轉自:天翼空間