C++中提供了初始化列表對成員變量進行初始化。
語法規則:class_name::class_name()
m1(v1),m2(v2,v3),m3(v3)
{
.......
}
注意:
成員的初始化順序,與成員的聲明順序相同。
成員的初始化順序與初始化列表的位置無關。
初始化列表比構造函數先執行。
測試代碼:
#include <stdio.h> class val { private: int i; public: val(int val) { i = val; printf("i = %d\n",i); } }; class Test { private: const int Ci=10; val m1; val m2; public: Test():m2(2),m1(1) { //Ci = 1; printf("Test::Test()\n"); } int get_Ci() { return Ci; } }; int main(int argc, char *argv[]) { Test Ci; printf("Ci = %d\n",Ci.get_Ci()); return 0; }
運行結果:
i = 1 i = 2 Test::Test() Ci = 10
類中的const成員
類中個const成員變量會被分配空間,(所分配空間的位置取決於對象在哪個位置被聲明。)
類中的const 成員的實質是一個只讀變量,可以通過指針修改其值。
類中個const 可以使用初始化列表指定初始值,也可以在定義的時候進行初始化。、
注意:編譯器無法得到const成員的初始值,因此在類中聲明的const 只讀變量無法進入符號表成為一個真正意義上的常量。
測試代碼:
#include <stdio.h> class val { private: int i; public: val(int val) { i = val; printf("i = %d\n",i); } }; class Test { private: const int Ci; val m1; val m2; public: Test():m2(2),m1(1),Ci(100) { //Ci = 1; printf("Test::Test()\n"); } int get_Ci() { return Ci; } void change_Ci(int CI) { int *p = const_cast<int *>(&Ci);//delete only read *p = CI; } }; int main(int argc, char *argv[]) { Test Ci; printf("Ci = %d\n",Ci.get_Ci()); Ci.change_Ci(1000); printf("Ci = %d\n",Ci.get_Ci()); return 0; }
上面代碼通過 const_cast<Type *>(&val);關鍵字去掉了Ci的只讀屬性。
然后通過*p = CI; 修改Ci的值
運行結果:
i = 1 i = 2 Test::Test() Ci = 100 Ci = 1000