C++98为类中提供类成员的初始化列表。
类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算1.类里面的任何成员变量在定义时是不能初始化的。
2.一般的数据成员可以在构造函数中初始化。
3.const数据成员必须在构造函数的初始化列表中初始化。
4.static要在类的定义外面初始化。
5.数组成员是不能在初始化列表里初始化的。
6.不能给数组指定明显的初始化。
这6条一起,说明了一个问题:C++里面是不能定义常量数组的!因为3和5的矛盾。这个事情似乎说不过去啊?没有办法,我只好转而求助于静态数据成员或者使用枚举。
但是在C++11中,我们可以利用类内初始化:
可以看到基本类型不用多说,可以在类内初始化。在这里我们重点看const 与static,引用,以及数组。const 的int 与float都能在类内初始化。但是static还是只有static const int 能在类内初始化,其他的static 还是能在类外初始化。而引用则可以在类内初始化。而无论是const 数组还是非const 数组,都不能在类内显示初始化。其中 int m[3] 为整型数组数据成员, 所以应该用constexpr表达式。关于constexpr和const的区别如下:int j = 15; class Bclass { private: int f = 100; float g = 200.0; const float h = 30.0; const int a=10; // const int array[20]; // int thesecondarray[20] = { 0 }; int &b=j; int &k = f; static int c; static const int d=30; static const float e;static const int d=30; static constexpr float g=9.5f;public:Bclass(){// array[20] = { 0 }; 注释去掉有错误//thesecondarray[20] = { 0 };}void print(){cout << a << " "<< b << " "<< c << " "<< d << " "<< e << " "<< f << " "<< g << " "<< h << " "<< k << endl;//for (int i = 0; i < 20; ++i)//cout << array[i] << " ";//for (int i = 0; i < 20; ++i)//cout << thesecondarray[i] << " ";}};int Bclass::c = 20;const float Bclass::e = 40.0;static constexpr float int m[3]={0,1,2};
const是表明这个值是constant的,但是不必在编译期确定,然而数组的大小是需要在编译期确定的,如:
然而对于constexpr,则表明这个值不仅是constant的,而且也是编译期确定的,于是,constexpr修饰的是可以用于数组大小的。
int i; // not constant
const int size = i; // fine!
int arr[size]; // Error!
int i; // not constant
constexpr int size = i; // Error!