構造函數、析構函數與賦值函數是每一個類最基本的函數。數組
對於任意一個類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
(1)若是沒有定義拷貝構造函數,編譯器會合成拷貝構造函數
函數行爲是逐個成員進行初始化,而後將新對象初始化爲原對象的副本。數組成員是例外,合成拷貝構造函數會拷貝整個數組。
(2)自定義拷貝構造函數
A(const A&);
大多數類應定義拷貝構造函數和默認構造函數。
(3)禁止拷貝
若是一個類須要禁止賦值,並需顯式地聲明拷貝構造函數爲private,這樣就不容許用戶代碼對該類類型的對象進行復制。
但類的友元和成員仍然能夠進行復制,也須要禁止的話,就須要聲明一個拷貝構造函數爲private且對它不進行定義。
轉自:天翼空間