計算機(jī)二級:c++默默為您編寫的函數(shù)

字號:

這一部分的條款講的都是類的構(gòu)造/析構(gòu)/賦值函數(shù)的使用。
    當(dāng)你寫下一個:
    1 class Empty {};
    經(jīng)過了編譯器的處理,就好像你寫下了如下的代碼:
    1 class Empty
    2 {
    3 public:
    4   Empty() {}                           //default構(gòu)造函數(shù)
    5   Empty(const Empty& rhs) {}           //copy構(gòu)造函數(shù)
    6   ~Empty() {}                          //析構(gòu)函數(shù)
    7
    8   Empty& operator=(const Empty& rhs) {}//copy assignment操作符
    9 }
    你看,c++編譯器會在你需要的時候創(chuàng)建
    1.default構(gòu)造函數(shù)
    2.析構(gòu)函數(shù)
    3.copy構(gòu)造函數(shù)
    4.copy assignment函數(shù)
    這樣一來,你就可以寫如下代碼了:
    1 Empty e1;     //調(diào)用了default構(gòu)造函數(shù)
    2
    3 Empty e2(e1); //調(diào)用了copy構(gòu)造函數(shù)
    4 e2 = e1;      //調(diào)用了copy assignment函數(shù)
    5                 //調(diào)用析構(gòu)函數(shù)
    好吧,知道了有這些函數(shù),可這些函數(shù)用來干什么?為什么編譯器要寫這些函數(shù)?
    1.default構(gòu)造函數(shù)和2.析構(gòu)函數(shù)主要是給編譯器一個放置代碼的地方,可以用來調(diào)用基類和non-static成員變量的構(gòu)造函數(shù)和析構(gòu)函數(shù)。
    3.copy構(gòu)造函數(shù)和4.copy assignment函數(shù),編譯器創(chuàng)建的版本只是簡單的將每一個non-static成員變量拷貝到目標(biāo)對象,看下面這個例子:
    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的值設(shè)定no2的值
    16                           //nameValue是string,首先會調(diào)用string的copy構(gòu)造函數(shù)并以no1.nameValue作為參數(shù)
    17                           //由于objectValue是內(nèi)置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構(gòu)造函數(shù)和copy assignment函數(shù)。