const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。
<pre name="code" class="cpp">class Test
{
public:
Test() : a(0) {}
enum { size1 = 100, size2 = 200 };
private:
const int a; // 只能在构造函数初始化列表中初始化,这个似乎很少用到???
static int b; // 不能赋值,初始化!!!!
const static int c; // 与static const int c;相同;可以在这里声明并定义赋值 c=0 (以便在此类的声明里被用到,如定义数组时需要长度int常量,但不是所有编译器都支持在这里初始化,有些支持,这些支持的[可能]要求你在实现文件中定义一次如“const int Test::c;”(设初值了); 如果不支持,在定义数长度时,可以用enum来代替常量int).
};
int Test::b = 0; //不能以成员列表初始化,不能在声明处初始化,因为不属于某个对象。
const int Test::c = 0;//注意:给静态成员变量赋值时,不能加static修饰。但const要加。
总结:
1. 只有const 则一定只能在初始化列表或者构造函数中初始化
2.只有static 则只能在函数体声明之外初始化
3.const与static同在,那变量在【类声明处(即头文件)---要编译器支持,如vs支持在此初始化】和 【函数体外(或实现文件)(但是不能加static修饰)】都可以初始化,但是不能在初始化列表初始化