在静态成员函数出来之前就已经有了静态成员变量。静态成员变量是为了为用户提供在类级别上访问,而不是类对象有关的数据。静态成员变量在编译期就存在了,而不像非静态成员变量只有实例化了对象才会给分配内存。静态成员变量是所有类对象共享的,例如,我们可以为类定义一个 static int n 来统计实例化了多少个对象,对象构造时 n++ , 析构时 n– 。
但是,如果为类定义的静态成员变量是私有的(不希望暴露在类外),就会遇到下面的问题:
class A
{
private:
static int n;
int b;
};
如果,我现在想在类外访问 n , 怎么办呢?
只能定义一个public 成员函数了:
class A
{
public:
int get_n()
{
return n;
}
private:
static int n;
int b;
};
...
A a;
a.get_n();
然后实例化一个对象来调用public 成员函数。但是,只是为了访问一个变量就实例化整个对象出来,是不是有点浪费资源呢?况且有些场景下这样做并不能解决问题。
还有一种方法,据说以前程序员都是使用下面的方式:
((A*)NULL)->get_n();
看起来不错,这样不需要实例化对象出来就达到了目的。但其实这样做很不安全,如果我在 get_n 成员函数中不小心使用了非静态成员变量b , 因为非静态成员只有实例化了对象才会给分配内存,这就会导致正在运行的程序崩溃。但是编译器却不会给报错,留下了安全隐患。
因此,后来C++引入了静态成员函数。
静态成员函数可以直接通过类名访问,也可以使用对象访问。不允许在静态成员函数中使用非静态成员函数和非静态成员变量。