C++中的const,static const和static类成员的初始化问题

时间:2021-02-16 20:03:08

C++中, const, static const, static这三种类成员的初始化容易出问题:

const 作为类成员,只能在构造函数初始化列表中被初始化(C++98);

(C++11提供了类内初始化,因此内类常量可在声明类时进行类内初始化,因此该类内常量的作用域属于类级,即该类的所有对象均具有同一个值。)

static 作为类成员,所有类对象共享该成员,只能类外部的.cpp文件中被初始化,初始化时不用指明static属性

static const 作为类成员,为const成员作为所有类共享的数据在类内初始化提供了可能,声明该变量是时必须在类内对其初始化

如果要取static const 成员变量地址,则必须对其变量进”类外定义“(该定义不指定值,容易误解为声明),因为编译器要求,如果要对内类const进行取地址,必须提供定义式。


const作为类成员为什么只能在初始化列表中被初始化呢?

构造函数创建对象时,对象在执行构造函数函数体前(即大括号之前)被创建(即分配存储空间)。因此,调用构造函数将为对象的成员变量分配内存。然后程序流程进入到构造函数函数体(大括号中的代码),使用常规的赋值方式对成员变量进行赋值。因此,对于const数据成员,必须在执行到构造函数体之前,即创建对象(即为const变量分配内存时),进行初始化。因此,const成员不能通过普通的构造函数来初始化。C++提供了一种特殊的语法完成上述工作——成员初始化列表,在构造函数函数体之前加入列表,将成员初始化,很好的解决了const成员初始化的问题。


C++初始化列表注意事项:

这种格式只能用于构造函数;

必须用这种格式初始化非静态const数据成员(c++11之前,因为c++11之后提供 类内初始化)

必须用这种格式初始化引用数据成员,因为引用变量必须要求在创建时就被初始化(这点跟const变量很相似)


数据成员被初始化的顺序是什么样呢?

与类声明中的顺序相同,与初始化器重的顺序无关。


C++11提供了类内初始化的方式,更霸道和方便!