静态成员变量是一种特殊的成员变量,它被关键字static修饰。
class Student { public: string getName() { return name; } static int total;//静态成员变量 private: string name; };这个student类声明了一个public的静态成员变量total,用来表明学生的总数,这个变量为这个类所共有,无论创建多少个学生对象,total变量在内存中都只有一个。
static 成员变量属于类,不属于某个具体的对象。 和普通的成员变量一样,static 成员变量也有private、protected、public 的访问控制。
static 成员变量必须在类声明的外部初始化(除了一个例外,之后会说到),以刚刚的类为例,其初始化具体形式为:
int Student::total=0; 类型 类名::变量名=值;(注意不必再加static) 初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为 0。全局数据区的变量都有默认的初始值 0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。被 private、protected、public 修饰的静态成员变量都可以用这种方式初始化。 需要注意的是,static 成员变量是在初始化时分配内存的。 不是在类声明时,也不是在创建对象时。因此,没有初始化的static 成员变量无法使用,因为还没分配内存。类型static const int可以类内初始化,如下。
class Student { public: string getName() { return name; } static const int total=1;//类内初始化 private: string name; };但在类内初始化了就不要在类外再进行一次,否则是重复定义。