程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 《Effective C++》讀書筆記05:c++默默為您編寫的函數

《Effective C++》讀書筆記05:c++默默為您編寫的函數

編輯:關於C++

這一部分的條款講的都是類的構造/析構/賦值函數的使用。

當你寫下一個:

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函數

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved