一个static类成员是静态分配的,而不是每个类对象的一部分。一般来说,static成员声明充当类外定义的声明,比如:
class Node{
static int node_count; //声明
};
int Node::node_count = 0; // 定义
但是,在很少的情况下,在类内声明中初始化static成员也是有可能的。条件是static成员必须是整数或者枚举类型的const,或者字面值类型的constexpr,而且初始化器必须是一个常量表达式。比如:
class Curious{
public:
static const int c1 = 7; //正确
static int c2 = 11; //错误,非const
const int c3 = 12; //正确,但是非static。 const必须声明时并定义
static const int c4 = sqrt(9); //错误,类内初始化器不是常量
static const float c5 = 7.0; //错误,类内初始化器不是整形(应该使用constexpr而不是const)
};
当且仅当你使用一个已初始化成员的方式要求它像对象一个在内存中存储时,该成员必须在某处唯一定义。初始化器不能重载:
const int Curious::c1 ; //ok, 不重复初始化器
const int Curious::c1 = 22; //错误,不重复初始化器
const int p = &Curious::c1 ; //ok, Curious::c1已经被定义了
成员常量的主要用途是为类声明中其他地方用到的 常量提供符号名称:
template<class T, int N>
class Fixed{
public:
static constexpr int max = N;
private:
T a[max];
};
对于整数,枚举值提供了另一种在类声明中定义符号常量的方法:
class X{
enum {c1 = 7, c2 = 11, c3 = 13};
};