必须使用初始化列表的情况
生活随笔
收集整理的這篇文章主要介紹了
必须使用初始化列表的情况
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在學(xué)習(xí)c++時(shí),一直對(duì)必須使用初始化列表的情況說(shuō)不全,或者說(shuō)不清楚。今天來(lái)總結(jié)學(xué)習(xí)一下。先回憶一下,必須使用初始化列表的情況
1.類數(shù)據(jù)成員為const類型2. 類數(shù)據(jù)成員為引用類型3.類沒(méi)有默認(rèn)的拷貝構(gòu)造4. 派生類的構(gòu)造函數(shù)初始化列表必須調(diào)用基類的構(gòu)造函數(shù)class test { public: test() { cout << "constructor with argument\n"; } private: const int i=10; }; 結(jié)果編譯錯(cuò)誤:
原因:因?yàn)槌A繑?shù)據(jù)成員必須進(jìn)行初始化,而不能被賦值。函數(shù)體內(nèi)只能進(jìn)行賦值,因此初始化列表是const數(shù)據(jù)成員初始化的唯一機(jī)會(huì)。明確了兩點(diǎn):
只有靜態(tài)常量成員才可以在類中初始化,如果沒(méi)有在類內(nèi)、類外初始化。則其會(huì)被初始化為0 或者 “空”(NULL或者string(“”))
非靜態(tài)常量成員必須在初始化列表中完成 再需要注意的就是static成員可以在類中聲明為任何的格式,但是數(shù)據(jù)成員定義必須在類的外部定義。與普通的數(shù)據(jù)成員不同,static成員不通過(guò)類構(gòu)造函數(shù)進(jìn)行初始化,而是應(yīng)該在定義時(shí)進(jìn)行初始化。 class test { public: test() { cout << "constructor with argument\n"; cout << i <<endl; } private: int& i; //static int j; 這里如果沒(méi)有給出初始化列表,編譯失敗。
編譯器提示,i必須在構(gòu)造函數(shù)初始值列表中初始化。
筆者在此做了一個(gè)有趣的測(cè)試,如果將引用類型改為靜態(tài)的數(shù)據(jù)成員,那么還需要進(jìn)行初始化列表嗎?class test { public: test() { cout << "constructor with argument\n"; cout << i <<endl; } private: static int& i; static int j; }; int test::j = 10; int& test::i = j; 結(jié)果可以看出,如果成員類型為靜態(tài)的引用類型,則應(yīng)該按照靜態(tài)數(shù)據(jù)成員對(duì)待。需要在類定義體外進(jìn)行定義并初始化。class Base { public: Base(int a) : val(a) {} private: int val; }; class A : public Base { public: A(int v) : p(v), Base(v) {} void print_val() { cout << "hello:" << p << endl;} private: int p; }; 再看一個(gè)例子,關(guān)于Copy函數(shù)應(yīng)注意的地方class Base { public: Base(int j):i(j) { cout << "constructor with argument\n"; int p = 20; i = p; cout << i <<endl; } private: int i; }; class Derive: public Base { public: Derive(int i ):Base(i),_i(i) { } Derive(const Derive &d):Base(d),_i(d._i) { } Derive& operator=(const Derive& d) { Base::operator=(d); _i = d._i; return *this; } private: int _i; }; 在這個(gè)例子中我們可以看到,派生類中的拷貝構(gòu)造函數(shù)對(duì)的初始化列表調(diào)用了基類構(gòu)造函數(shù)進(jìn)行初始化。在賦值構(gòu)造函數(shù)中也調(diào)用了基類的賦值構(gòu)造函數(shù)對(duì)基類部分進(jìn)行構(gòu)造。
來(lái)自為知筆記(Wiz)
1.類數(shù)據(jù)成員為const類型2. 類數(shù)據(jù)成員為引用類型3.類沒(méi)有默認(rèn)的拷貝構(gòu)造4. 派生類的構(gòu)造函數(shù)初始化列表必須調(diào)用基類的構(gòu)造函數(shù)
- const 數(shù)據(jù)成員
原因:因?yàn)槌A繑?shù)據(jù)成員必須進(jìn)行初始化,而不能被賦值。函數(shù)體內(nèi)只能進(jìn)行賦值,因此初始化列表是const數(shù)據(jù)成員初始化的唯一機(jī)會(huì)。明確了兩點(diǎn):
- 引用類型的數(shù)據(jù)成員
編譯器提示,i必須在構(gòu)造函數(shù)初始值列表中初始化。
筆者在此做了一個(gè)有趣的測(cè)試,如果將引用類型改為靜態(tài)的數(shù)據(jù)成員,那么還需要進(jìn)行初始化列表嗎?
- 如果類沒(méi)有默認(rèn)構(gòu)造函數(shù)
- class Base
- {
- public:
- Base(int a) : val(a) {}
- private:
- int val;
- };
- class A
- {
- public:
- A(int v) : p(v), b(v) {}
- void print_val() { cout << "hello:" << p << endl;}
- private:
- int p;
- Base b;
- };
- 如果存在繼承關(guān)系,派生類中必須在其初始化列表中調(diào)用基類的構(gòu)造函數(shù)
來(lái)自為知筆記(Wiz)
轉(zhuǎn)載于:https://www.cnblogs.com/chengkeke/p/5417352.html
總結(jié)
以上是生活随笔為你收集整理的必须使用初始化列表的情况的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理解Storm Metrics
- 下一篇: UIAlertController 大坑