类的静态变量和静态函数

如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干。但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享。

可以使用全局变量,但用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,因此在实际开发中很少使用全局变量。

静态变量

  • 对于类的静态成员变量,只有static const int类型和 enum 类型能在类里面初始化,其他只能在.cpp里初始化,但不能在类体内初始化,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。

  • 静态成员函数和静态变量在类体外初始化时,无须加static关键字,否则是错误的。

  • static成员变量的内存空间是在初始化时分配,程序结束才释放,跟类对象的销毁无关。

  • 静态变量不参与sizeof计算,因为它不占用对象的内存

  • 静态成员仍然遵循public,private,protected访问准则。

静态函数

  • 静态成员函数只能调用静态变量,因为没有this指针。 设计它的初衷是把类名当成namespace用,控制类内的static变量。

  • 静态成员函数仍然遵循访问等级,但最好是public,否则不能直接用类名::调用

  • 非静态成员函数可以任意地访问静态成员函数和静态数据成员。

  • 静态成员函数不能声明为虚函数,编译直接报错

  • 静态成员函数与成员函数不能同名同参数,也就是静态和非静态函数不能重载,否则编译器不知调用哪个

举例:

1
2
3
4
5
6
7
8
9
10
11
12
// 头文件
class Obj
{
private:
Obj() {}
static Obj* instance;

public:
static Obj* getInstance();
static const int n = 12;
static int n;
};

1
2
3
4
5
6
7
8
9
10
11
//源文件
Obj* Obj::instance=0; //类外定义
int Obj::n = 4; //类外定义
Obj* Obj::getInstance()
{
if(!instance)
{
instance = new Obj();
}
return instance;
}

参考:
Essential C++ 115页