注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 10.10
gcc版本:4.4.5
一、問題
類中是否可以定義const成員?
類中可以巨集定義const成員變數,只能通過成員列表進行初始化。
二、小實驗
1)下面的類定義是否合法?
- 如果合法,ci的值是什麼,存在在**?
class test
};
程式設計實驗
類中的const成員
20-1.cpp
#include class test
int getci()
};int main()
操作:
1)g++ 20-1.cpp -o 20-1.out編譯正確,列印結果:
t.ci = 10
2)測試:不在建構函式的初始化列表初始化const修飾的變數ci,**如下:
#include class test
int getci()
};int main()
操作:g++ 20-1.cpp -o 20-1.out編譯錯誤:
20-1.cpp:8:2 error: uninitialized member 'test::ci' with 'const' type 'const int'
test()
20-1.cpp:10:6: error: assignment of read-only member 'test::ci'
ci = 10;
三、類成員的初始化
1)c++中提供了初始化列表對成員變數進行初始化
2)語法規則
class name::class name() : m1(v1), m2(v1,v2), m3(v3) //初始化列表對成員變數進行初始化
3)注意事項
- 成員的初始化順序與成員的宣告順序相同
- 成員的初始化順序與初始化列表中的位置無關
- 初始化列表先於建構函式的函式體
程式設計試驗
初始化列表的使用
20-2.cpp
#include class value
int geti()
};class test
};int main()
操作:
1)編譯:g++ 20-2.cpp -o 20-2.out,列印結果:
i = 2
i = 3
i = 1
test::test()
分析:
列印結果證明了先執行初始化列表,在執行建構函式。成員變數宣告順序,決定了變數在初始化列表宣告順序。
四、類中的const成員
1)類中的const成員會被分配空間的(和類空間位置一致)
2)類中的const成員的本質是唯讀變數
3)類中的const成員只能在初始化列表中指定初始值
編譯器無法直接得到const成員的初始值,因此無法進入符號表成為真正意義上的常量。
程式設計實驗
唯讀成員變數
20-3.cpp
#include class value
int geti()
};class test
int getci()
void setci(int v)
};int main()
操作:
1) g++ 20-3.cpp -o 20-3.out編譯正確,執行結果:
i = 2
i = 3
i = 1
test::test()
t.ci = 100
t.ci = 10
分析:
const修飾的成員變數,並不是真正意義的常量,可以通過指標進行修改。
五、小插曲
1)初始化與賦值不同
- 初始化:對正在建立的物件進行初值設定
- 賦值:對已經存在的物件進行值設定
初始化和賦值的不同
int main()
小結
1)類中可以使用初始化列表對成員進行初始化
2)初始化列表先於建構函式體執行
3)類中可以定義const成員變數
4)const成員變數必須在初始化列表中指定初值
5)const成員變數為唯讀變數
C 20 初始化列表的使用
問題 類中是否可以定 const 成員?下面的類定義是否合法?如果合法,ci的值是什麼,儲存在 class test include class test int getci int main 輸出 test.cpp 8 error uninitialized member test ci with...
第20課 初始化列表的使用
類中是否可以定義const成員?下面的類定義是否合法?如果合法,ci 的值是什麼,儲存在 1 class test 27 1 include 2 3class test412 intgetci 1316 17 1819 intmain 20類中的const成員 在c中 const 修飾的變數必須在定...
第20課 初始化列表的使用
類中是否可以定義const成員?下面的類定義是否合法?如果合法,ci 的值是什麼,儲存在 1 class test 27 1 include 2 3class test412 intgetci 1316 17 1819 intmain 20類中的const成員 在c中 const 修飾的變數必須在定...