C++为什么要引入静态成员函数

在静态成员函数出来之前就已经有了静态成员变量。静态成员变量是为了为用户提供在类级别上访问,而不是类对象有关的数据。静态成员变量在编译期就存在了,而不像非静态成员变量只有实例化了对象才会给分配内存。静态成员变量是所有类对象共享的,例如,我们可以为类定义一个 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++引入了静态成员函数。

静态成员函数可以直接通过类名访问,也可以使用对象访问。不允许在静态成员函数中使用非静态成员函数和非静态成员变量。

你可能感兴趣的:(C/C++)