类内声明静态变量:
// static_variable.h
class a
{
static int var;
};
// static_variable.cpp
#include "static_variable.h"
int a::var = 2;
说明 :
1、static
变量必须在类方法文件(cpp)初始化,且初始化时不加static
。因为声明文件为头文件,头文件内初始化可能会有多个文件包含,引发重定义。
2、类的静态变量属于整个类共有,所有类对象共用,存储静态区。
3、对于静态变量(除const静态成员外),类定义内部的那个叫引用性声明(即使可以类内写初始化代码)。其与类是一个级别的,因此类中静态变量必须在类外定义,与全局变量一样存储静态区。
类内常量:
1、示例
//头文件.h
class a {
const int monsts = 12; // C++11才有效:类内初始化
//C++11前需要使用构造函数的初始化列表
a():months(12) {}
};
C++11前不能使用原因 :类声明只描述结构,类对象定义前没有内存空间用于存储,只有定义了才有空间存放。
注:头文件内class
外可以定义const常量,内部链接性(本文件可用),为定义常量专门设计的。详解
//头文件.h
const int a =2;
2、示例(static const 为类对象共有)
//.h
class a {
static const int monst1 = 12;
static const double monst2;
enum{ month3 = 12; }
};
//.cpp
const double a::monst2 = 12.2;
正确原因 :
1、static const成员的类内初始化仅新编译器支持,且只允许对整形常量初始化,对于非整形常量使用类外初始化。
2、静态区存储,常量,所有对象共享。
3、由于表示常量,因此枚举不需要定义类型名。
但两者区别为:enum
枚举只能定义整数,static const
可以定义浮点数。
参考资料:
C++ Primer Plus:第12.1.1节 428页 与 10.6.1节 371页
C++ —— 类中static和const关键字声明变量的初始化方式总结