比较基础的是:在类中如果定义了static静态数据成员,在类中声明,但是在定义时需要在类外,而不能使用构造函数。比如:
//test.h
class test {
private:
static int num;
……
在类实现文件中,给出定义和初值:
//test.cpp
int test::num = 5;
……
test类的所有对象共享这个静态变量。一般来说,是不能在类声明中初始化静态数据成员的,不过有两种例外情况:(c++ primer plus 428页)
1.static const int
2.枚举型const
但是即使是例外情况,它仍然只是声明。
有一种应用场景是,如果想把符号常量放入类的作用域内,比如对所有对象来说,数组的长度时固定的,这个时候,如果你这样做:
class Bakery{
private:
const int Month = 12;
double cost[Month];
……
但这样是不对的(c++ primer plus 371页),因为上述只是对Month的声明而非定义,而且此时类处在声明阶段,还没有分配存储,此时赋给Month初值是错误的。
由上文知,static int类型的变量可以在类声明中赋初值,因此,可以改写如下:
class Bakery{
private:
static int Month = 12;
double cost[Month];
……
这样是可以的,但是需要补充的是(effective c++第15页),由于它是static类型的静态数据,而上述又只是声明,因此必须在类实现文件中写:
const int Bakery::Month;
这个时候不需要给值,因为在声明中已经给过了。
还有一种可替代的解决办法,即使用enum:
class Bakery{
private:
enum{Month = 12};
double cost[Month];
……
需要注意的是:并不会创建类数据成员,所有对象中都不会包括枚举。Month只是一个符号名称,在作用域为类的代码中遇到时,编译器直接用12来替换。