這一部分的條款講的都是類的構造/析構/賦值函數的使用。
當你寫下一個:
1 class Empty {};
經過了編譯器的處理,就好像你寫下了 如下的代碼:
1 class Empty
2 {
3 public:
4 Empty() {} //default構造函數
5 Empty(const Empty& rhs) {} //copy構造函數
6 ~Empty() {} //析構函數
7
8 Empty& operator=(const Empty& rhs) {}//copy assignment操作符
9 }
你看,c++編譯器會在你需要的時候創建
1.default構造函數
2.析構函數
3.copy構造函數
4.copy assignment函數
這樣 一來,你就可以寫如下代碼了:
1 Empty e1; //調用了default構造函數
2
3 Empty e2(e1); //調用了copy構造函數
4 e2 = e1; //調用了 copy assignment函數
5 //調用析構函數
好吧,知道了有這些函數,可這些函數用來干什麼?為什麼編譯器要寫這些函數?
1.default構造函數和2.析構函數主要是給編譯器一個放置代碼的地方,可以用來 調用基類和non-static成員變量的構造函數和析構函數。
3.copy構造函數和 4.copy assignment函數,編譯器創建的版本只是簡單的將每一個non-static成員變量拷 貝到目標對象,看下面這個例子:
1 using namespace std;
2
3 class NameObject
4 {
5 public:
6 NameObject(const char* name, const int& value);
7 NameObject(const string& name, const int& value);
8
9 private:
10 string nameValue;
11 int objectValue;
12 }
13
14 NameObject no1 ("Smallest Prime Number", 2);
15 NameObject no2(no1); //以 no1.nameValue和no1.objectValue的值設定no2的值
16 //nameValue是string,首 先會調用string的copy構造函數並以no1.nameValue作為參數
17 //由於 objectValue是內置int型,所以會直接將它的每一位拷貝過去。
上面的例子是理想的情況,就是每個變量都是可以直接賦值過去的,沒有引用類型和 const類型,假如有這兩種類型的成員變量,則會報錯
1 class NameObject
2 {
3 public:
4 NameObject(string& name, const int& value);
5 private:
6 string& nameValue; //引用類型
7 const int objectValue; //const類 型
8 };
9
10 int main()
11 {
12 string newDog ("DaHuang");
13 string oldDog("XiaoGuai");
14 NameObject p(newDog, 2);
15 NameObject s(oldDog, 36);
16 p = s; //錯誤,不能更改non-static的引用成員的指向,不能更改const成員 的值
17 //所以編譯器提示不能 使用default assignment,並報錯
18 return 0;
19 system("PAUSE");
20 }
所以,在存在這樣的成員變量時,盡可能自己定義coyy構造函數和copy assignment函數