往往被初学者忽视的是,C++类中的数据初始化是有讲究的,
一般需要遵循以下几条约束:
1.一般而言,类里面的任何成员变量在定义时是不能初始化的。
【为什么???】
这是一个可以值得探讨的话题,每个人的解释都不一样,大部分人都认为这是编译语法的规定,那么有没有考虑为什么会有这个规定呢?
个人认为可能的原因有:
(1)类只是一个抽象类型,并不是实体的东西,利用这个抽象类型会实例化成不同的个体,每个个体的特征(数据成员)都不一样,如果在类定义中将特征初始化了,岂不是破坏了抽象性,做了一个面向都一样的模子?
(2)类的定义实际相当与类型声明,并没有分配存储空间,初始化的数据哪里放? 类实例化以后才会有实体存储地址及空间。
(3)关于C++内部对象模型的考虑,后续有专门文章分析。
2.一般的数据成员可以在构造函数中初始化。(构造初始化列表初始化和构造函数体内赋值初始化)
3.const数据成员必须在构造函数的初始化列表中初始化(道理很简单,const成员第一次数据初始化就是发生在类构造数据初始化时,一旦过了此时就会出现问题)。
4.static要在类的定义外面初始化。
5.数组成员是不能在初始化列表里初始化的,不能给数组指定明显的初始化。
或许有人问,以上几条似乎有冲突喔!
一个类中能不能定义常量数组?如:
const int aa[100];
如果可以,怎么初始化aa?
实际上不行的,这与3 5 矛盾。我们可以用static数据成员来解决此问题。