這一部分的條款講的都是類的構(gòu)造/析構(gòu)/賦值函數(shù)的使用。
當(dāng)你寫下一個(gè):
1 class Empty {};
經(jīng)過(guò)了編譯器的處理,就好像你寫下了如下的代碼:
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++編譯器會(huì)在你需要的時(shí)候創(chuàng)建
1.default構(gòu)造函數(shù)
2.析構(gòu)函數(shù)
3.copy構(gòu)造函數(shù)
4.copy assignment函數(shù)
這樣一來(lái),你就可以寫如下代碼了:
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ù)用來(lái)干什么?為什么編譯器要寫這些函數(shù)?
1.default構(gòu)造函數(shù)和2.析構(gòu)函數(shù)主要是給編譯器一個(gè)放置代碼的地方,加入收藏可以用來(lái)調(diào)用基類和non-static成員變量的構(gòu)造函數(shù)和析構(gòu)函數(shù)。
3.copy構(gòu)造函數(shù)和4.copy assignment函數(shù),編譯器創(chuàng)建的版本只是簡(jiǎn)單的將每一個(gè)non-static成員變量拷貝到目標(biāo)對(duì)象,看下面這個(gè)例子:
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,首先會(huì)調(diào)用string的copy構(gòu)造函數(shù)并以no1.nameValue作為參數(shù)
17 //由于objectValue是內(nèi)置int型,所以會(huì)直接將它的每一位拷貝過(guò)去。
上面的例子是理想的情況,就是每個(gè)變量都是可以直接賦值過(guò)去的,沒(méi)有引用類型和const類型,假如有這兩種類型的成員變量,則會(huì)報(bào)錯(cuò)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; //錯(cuò)誤,不能更改non-static的引用成員的指向,不能更改const成員的值
17 //所以編譯器提示不能 使用default assignment,并報(bào)錯(cuò)
18 return 0;
19 system("PAUSE");
20 }
所以,在存在這樣的成員變量時(shí),盡可能自己定義coyy構(gòu)造函數(shù)和copy assignment函數(shù)。
當(dāng)你寫下一個(gè):
1 class Empty {};
經(jīng)過(guò)了編譯器的處理,就好像你寫下了如下的代碼:
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++編譯器會(huì)在你需要的時(shí)候創(chuàng)建
1.default構(gòu)造函數(shù)
2.析構(gòu)函數(shù)
3.copy構(gòu)造函數(shù)
4.copy assignment函數(shù)
這樣一來(lái),你就可以寫如下代碼了:
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ù)用來(lái)干什么?為什么編譯器要寫這些函數(shù)?
1.default構(gòu)造函數(shù)和2.析構(gòu)函數(shù)主要是給編譯器一個(gè)放置代碼的地方,加入收藏可以用來(lái)調(diào)用基類和non-static成員變量的構(gòu)造函數(shù)和析構(gòu)函數(shù)。
3.copy構(gòu)造函數(shù)和4.copy assignment函數(shù),編譯器創(chuàng)建的版本只是簡(jiǎn)單的將每一個(gè)non-static成員變量拷貝到目標(biāo)對(duì)象,看下面這個(gè)例子:
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,首先會(huì)調(diào)用string的copy構(gòu)造函數(shù)并以no1.nameValue作為參數(shù)
17 //由于objectValue是內(nèi)置int型,所以會(huì)直接將它的每一位拷貝過(guò)去。
上面的例子是理想的情況,就是每個(gè)變量都是可以直接賦值過(guò)去的,沒(méi)有引用類型和const類型,假如有這兩種類型的成員變量,則會(huì)報(bào)錯(cuò)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; //錯(cuò)誤,不能更改non-static的引用成員的指向,不能更改const成員的值
17 //所以編譯器提示不能 使用default assignment,并報(bào)錯(cuò)
18 return 0;
19 system("PAUSE");
20 }
所以,在存在這樣的成員變量時(shí),盡可能自己定義coyy構(gòu)造函數(shù)和copy assignment函數(shù)。