C++——初始化列表

来源:互联网 发布:用迅雷下载网络异常 编辑:程序博客网 时间:2024/05/05 16:45

我们已经知道const变量在C++里成了真正意义上的常量了,const变量的值保存在符号表里,虽然某些操作也会为其分配内存,但是值并不会保存在那块分配的内存。既然是常量,所以我们不能在程序里作为左值,所以必须在定义的时候就初始化,但是类成员变量粗了static const int成员变量,其他类型的都只能定义,不能定义的时候初始化,那么我们可以在类里提供一个const类型的成员变量嘛?编译器是允许呢!

那我们在哪里初始化const类型的成员变量呢?难道在构造函数中嘛,肯定不行,const不能是左值啊。所以就引出了我们今天的主角,初始化列表。

当然初始化列表可以对任何一个成员变量进行初始化,不仅仅是const类型的成员变量。

初始化列表是在构造函数的函数体之前执行的操作。而且比较有趣的是,初始化的顺序并不是按照初始化列表中的出现顺序,而是由成员变量声明的顺序决定的。通过一小段代码说明。

class Test{    int a;    int b;    const int c;public:    Test():c(0),b(0)    {        a = 0;    }};

在这里使用了初始化列表对一部分成员变量进行了初始化,这里不考虑a的初始化了,因为它是在构造函数内部,此时初始化列表已经执行完操作了。初始化列表首先出现的是c,其次是b,但是按照声明的顺序,是b先被初始化为0,然后c被初始化0。此时a并没有初始化,如果列表中有a,不管第几个出现,一定是第一个被初始化的。

看似到这里都Ok了,其实并没有。因为在编译的时候const类型的成员变量没有初始值,所以无法进入常量表成为真正的常量。类中的const类型成员变量会分配内存,只是c语言中意义上的具有只读属性的变量,说到底类中的const类型变量还是变量,而不是常量,可以通过强制转换为非const指针或引用修改。这就真正叙述完了。