静态数据被看作类类型内的全局变量。对于非静态数据成员,每个对象都有自己的副本,而静态数据成员在整个类种只有一份,可以被类的所有对象共享访问。与全局变量相比,静态数据成员有以下两个优点:
- 静态数据成员没有进入程序的全局作用域,只是在类的作用域内;
- 可以实现信息隐藏,静态成员可以是private成员,而全局变量则不能;
class obj{
static int cnt;//静态数据成员
public:
//构造函数中应当存在cnt
obj(){cnt++;}
~obj(){cnt--;}
int getCnt() const {return cnt;}
};
static数据成员不是属于某个特定对象,因而不能在构造函数中初始化。
static数据成员在类定义之外初始化,在定义时要使用类名字限定静态成员,但不需要重复出现static关键字。
int obj::cnt = 0;
//对静态数据成员的初始化
static成员只能被定义一次,定义一般不放在头文件中,而是放在包含成员函数定义的源文件中。
- 静态数据成员从属于类,非静态数据成员从属于对象;
- 静态数据成员存放于静态存储区,由本类的所有对象共享,生命期不依赖于对象;
- 非静态数据成员独立存放于各个对象中,生命期依赖于对象,随对象的创建而存在,随对象的销毁而消亡;
static const
class Account{
static double rate;
double balance;
static const int maxClientNumber;
public:
...
};
const int Account::maxClientNumber = 2;//初始化类中的常量
C++中可以在类定义中初始化整值类型的static const,而其他类型不能在类中初始化。
静态数据成员访问
类的成员函数可以直接访问。非成员函数可以通过对象或指针来访问,也可以通过类名限定的静态成员函数来访问。
class obj{
static int cnt;//静态数据成员
friend void func(obj& o);//将func声明为obj的友元
public:
//构造函数中应当存在cnt
obj(){cnt++;}
~obj(){cnt--;}
int getCnt() const {return cnt;}
};
int obj::cnt = 0;//初始化
void func(obj& o){
cout << o.cnt << endl;//成员访问法
cout << obj::cnt << endl;//类名限定访问
}