有关const成员、static成员、const static成员的初始化:
1、const成员:只能在构造函数后的初始化列表中初始化
2、static成员:初始化在类外,且不加static修饰
3、const static成员:类只有唯一一份拷贝,且数值不能改变。因此,可以在类中声明处初始化,也可以像static在类外初始化
示例:
#include <iostream>
using std::cout;
using std::endl;
class base
{
public:
base(int x=8):a(x){};//const成员在构造函数初始化
const int a;
static int b;
const static int c=9;//const static成员在类内初始化
};
int base::b=9;//static成员在类外初始化,可以修改
//const int base::c=10;//也可以像static在类外初始化
int main()
{
base obj;
cout<<obj.a<<endl;
cout<<base::b<<endl;
cout<<base::c<<endl;
}
如果你想初始化一个类中的常量数据成员,只能用一种方法,在构造函数后的初始化列表中初始化;
类中的静态成员只有常量整数(不局限于int,如:short等)可以申明和定义一并出现,否则只能申明。
实例见:http://blog.csdn.net/liuxialong/article/details/6573025
C++标准 9.4.2.4 是这么说的:
If a static data member is of const integral or const enumeration type, its decalaration in the class can specify a constant-initializer which shall be an integral constant expression.
可以看到,对类中的数据成员进行初始化的条件是:
1. 必须是一个(static)静态成员。对于非静态成员不能在类定义中进行初始化。
2. 静态成员的声明中必须是有 const 限定。非 const 的静态成员不能在类定义中进行初始化。
3. 静态成员的类型必须为整型或者是枚举型。其它类型(如浮点型、数组、指针等)不能在类定义中进行初始化。
4. 只能使用一个整型常量表达式(integral constant expression)来进行初始化。
一个编译器应该对于违反上述任何一条的程序进行报错(error)或者最低限度是警告(warning)处理,否则就是编译器的失职。
标准中还对特别指出了什么不能作为整型常量表达式(integral constant-expression):
In particular, except in sizeof expressions, functions, class objects, pointers, or references shall not be used.
因此,函数(function)等非整型常量表达式,用来初始化类定义中的整型常量静态成员是非法的。
如果编译器对此不报错,说明编译器对标准的支持还有待提高。
类中 static const double PI=3.1416;
error:只有静态常量整型数据成员才可以在类中初始化 常整型静态数据成员可以在类中直接初始化,而常实型静态数据成员不可以 class circle { int a; // 普通变量,不能在类中初始化 static int b; // 静态变量,不能在类中初始化 static const int c=2; // 静态常量,可以在类中初始化 static const double PI=3.1416;//error C2864: 只有静态常量整型数据成员才可以在类中初始化 } ; b可以在类外进行初始化,且所有对象共享一个b的值: int circle::b = 2;