C++11中类数据成员初始化方法详解

来源:互联网 发布:当淘宝客服的心得体会 编辑:程序博客网 时间:2024/04/29 11:33

C++98为类中提供类成员的初始化列表。

类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员  2.进入构造函数后在构造函数中执行一般计算
  1.类里面的任何成员变量在定义时是不能初始化的。
  2.一般的数据成员可以在构造函数中初始化。
  3.const数据成员必须在构造函数的初始化列表中初始化。
  4.static要在类的定义外面初始化。   
  5.数组成员是不能在初始化列表里初始化的。
  6.不能给数组指定明显的初始化。  

这6条一起,说明了一个问题:C++里面是不能定义常量数组的!因为3和5的矛盾。这个事情似乎说不过去啊?没有办法,我只好转而求助于静态数据成员或者使用枚举。

但是在C++11中,我们可以利用类内初始化:

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;
        static constexpr float int m[3]={0,1,2};
 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;
可以看到基本类型不用多说,可以在类内初始化。在这里我们重点看const 与static,引用,以及数组。const  的int 与float都能在类内初始化。但是static还是只有static const int 能在类内初始化,其他的static 还是能在类外初始化。而引用则可以在类内初始化。而无论是const 数组还是非const 数组,都不能在类内显示初始化。其中 int m[3] 为整型数组数据成员, 所以应该用constexpr表达式。关于constexpr和const的区别如下:

const是表明这个值是constant的,但是不必在编译期确定,然而数组的大小是需要在编译期确定的,如:

int i; // not constantconst int size = i; // fine!int arr[size]; // Error!
然而对于constexpr,则表明这个值不仅是constant的,而且也是编译期确定的,于是,constexpr修饰的是可以用于数组大小的。
int i; // not constantconstexpr int size = i; // Error!



0 0
原创粉丝点击