第20课 - 初始化列表的使用
第20課 - 初始化列表的使用
0. 問題
類中是否可以定義 const 成員?
下面的類定義是否合法?如果合法,ci 的值是什么,存儲(chǔ)在哪里?
1 class Test 2 { 3 private: 4 const int ci; 5 public: 6 int getCI() { return ci;} 7 }; 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 const int ci; 7 public: 8 Test() 9 { 10 ci = 10; 11 } 12 int getCI() 13 { 14 return ci; 15 } 16 }; 17 18 19 int main() 20 { 21 Test t; 22 23 printf("t.ci = %d\n", t.getCI()); 24 25 return 0; 26 } 類中的const成員在C中:const 修飾的變量必須在定義的時(shí)候進(jìn)行初始化,不能在定義之后對(duì)其進(jìn)行賦值操作,違背了const 的含義。
在C++中:構(gòu)造函數(shù)內(nèi)部是對(duì)成員變量進(jìn)行賦值操作,而不是初始化。初始化需要初始化列表。
1. 類成員的初始化
(1)C++ 中提供了初始化列表,可以對(duì)成員變量進(jìn)行初始化
(2)語(yǔ)法規(guī)則:
ClassName::ClassName():m1(v1), m2(v2,v3),m3(v3) {//其它初始化操作 } 1 // 構(gòu)造函數(shù)是對(duì)變量進(jìn)行賦值操作,初始化列表是進(jìn)行初始化操作,兩個(gè)是不同的概念 2 3 #include <stdio.h> 4 5 class Test 6 { 7 private: 8 int i; 9 int j; 10 const int k; 11 public: 12 int getI() 13 { 14 return i; 15 } 16 int getJ() 17 { 18 return j; 19 } 20 int getK() 21 { 22 return k; 23 } 24 25 Test() : k(10) 26 { 27 printf("invoke consttuctor!\n"); 28 i = 1; 29 j = 2; 30 } 31 }; 32 33 int main(void) 34 { 35 Test t1; 36 37 printf("t1.getI() = %d, t1.getJ() = %d, t1.getK() = %d\n", t1.getI(), t1.getJ(), t1.getK()); 38 39 return 0; 40 } const變量的初始化(解決構(gòu)造函數(shù)中不能初始化)(3)注意事項(xiàng)
① 成員的初始化順序與成員的聲明順序相同,而與初始化列表中的位置無(wú)關(guān)
② 初始化列表先于構(gòu)造函數(shù)的函數(shù)體執(zhí)行
1 #include <stdio.h> 2 3 class value 4 { 5 private: 6 int m_i; 7 public: 8 value(int val) : m_i(100) 9 { 10 printf("in value!\n"); 11 printf("m_i = %d\n", m_i); 12 m_i = val; 13 } 14 15 int getM_i() 16 { 17 return m_i; 18 } 19 }; 20 21 class Test 22 { 23 private: 24 value m1; 25 value m2; 26 public: 27 Test() : m1(1), m2(2) // 初始化列表,對(duì)m1, m2進(jìn)行初始化。初始化還是調(diào)用value類中的構(gòu)造函數(shù),但還是先執(zhí)行value中的初始化列表 28 { 29 printf("in Test!\n"); 30 } 31 32 int get() 33 { 34 return m1.getM_i(); 35 } 36 }; 37 38 int main(void) 39 { 40 Test t1; 41 42 printf("t1.get() = %d\n", t1.get()); 43 44 return 0; 45 } 初始化列表的使用2. 類中的 const 成員
(1)類中的 const 成員會(huì)被分配空間,局部對(duì)象會(huì)分配??臻g、動(dòng)態(tài)對(duì)象會(huì)分配堆空間、全局對(duì)象會(huì)分配靜態(tài)存儲(chǔ)空間(和const int i; 不同)
(2)類中的 const 成員的本質(zhì)是只讀變量,可以通過指針隱式的修改。編譯器無(wú)法直接得到 const 成員的初始值,因此無(wú)法進(jìn)入符號(hào)表成為真正意義上的常量
(3)類中的 const 成員只能在初始化列表中指定初始值
1 #include <stdio.h> 2 3 class Value 4 { 5 private: 6 int mi; 7 public: 8 Value(int i) 9 { 10 printf("i = %d\n", i); 11 mi = i; 12 } 13 14 int getI() 15 { 16 return mi; 17 } 18 }; 19 20 class Test 21 { 22 private: 23 const int ci; 24 Value m2; 25 Value m3; 26 Value m1; 27 public: 28 Test() : m1(1), m2(2), m3(3), ci(100) // 成員變量的初始化 29 { 30 printf("Test::Test()\n"); 31 } 32 33 int getCI() 34 { 35 return ci; 36 } 37 38 int setCI(int v) 39 { 40 // 說明ci是個(gè)只讀變量,可以通過指針修改內(nèi)存值 41 int* p = const_cast<int*>(&ci); 42 *p = v; 43 } 44 }; 45 46 int main() 47 { 48 Test t; 49 50 printf("t.ci = %d\n", t.getCI()); 51 52 t.setCI(10); 53 54 printf("t.ci = %d\n", t.getCI()); 55 56 return 0; 57 } const只讀成員變量【小插曲】初始化與賦值不同
(1)初始化:對(duì)正在創(chuàng)建的對(duì)象進(jìn)行初值設(shè)置
(2)賦值: ? 對(duì)已經(jīng)存在的對(duì)象進(jìn)行值設(shè)置
3. 小結(jié)
(1)類中可以使用初始化列表對(duì)成員進(jìn)行初始化
(2)初始化列表先于構(gòu)造函數(shù)體執(zhí)行
(3)類中可以定義 const 成員變量
(4)const 成員變量必須在初始化列表中指定初始值
(5)const 成員變量為只讀變量
?
轉(zhuǎn)載于:https://www.cnblogs.com/shiwenjie/p/7235100.html
總結(jié)
以上是生活随笔為你收集整理的第20课 - 初始化列表的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: macOS上搭建RabbitMQ+MQT
- 下一篇: BZOJ 3236[AHOI2013]作