当我们在类里使用const定义一个成员变量会发生什么?能够通过构造函数直接初始化const定义的标识符吗?
class Test
{
private:
const int ci;
int var1;
int var2;
int var3;
public:
Test()
{
//ci = 10;//error
}
int getCI()
{
return ci;
}
};
这段代码中说明了在构造函数里直接初始化const标识符是错误的。但是不对它进行初始化编译也是错误的,那么该如何初始化?肯定也不会是像以往那样往构造函数传入实参,现在需要使用另一种初始化方式----初始化列表。
利用C++提供的初始化列表可以对成员变量(包括const变量)进行初始化,具体语法规则为:
class Test :: Test() : var1(v1),var2(2),var3(3),ci(10)
{
...
...
}
语法规则简单,但是还是需要注意一下。
1、成员的初始化顺序与成员的声明顺序相同,即与初始化列表中的顺序无关。如上面构造函数的初始化列表顺序是var1最先,ci最后,但是实际初始化顺序却是最先ci,再var2,然后var1,最后才是var3.
2、初始化列表先于构造函数的函数体执行。当构造函数的函数体开始执行时,对象已经创建完毕了,执行函数体只是为了初始化构造函数的状态而已,所以说初始化
列表一定是在对象创建的同时执行,先于函数体。
当我们使用另一个类对象作为当前类成员变量时也需要用到初始化列表。为什么呢?因为在创建类对象是必须要进行初始化,但是在类中定义变量时又不能直接初始化,所以就通过初始化列表在创建新类对象的同时初始化对象成员变量。
做个小结:
1、类中的const成员会被分配空间
2、类中的const成员本质是只读变量
3、类中的const成员只能在初始化列表中指定初始值。
4、编译器无法直接得到const成员初始值,因此无法进入符号表成为真正意义上的常量
5、类中的const成员可以使用const_cast去除只读属性后通过指针修改值
6、初始化是对正在创建的对象进行初值设置,赋值是对已经存在的对象进行值设置