作者:gzshun. 原创作品,转载请标明出处!
来源:http://blog.csdn.net/gzshun
静态成员的提出是为了解决数据共享的问题。
一、静态数据成员
静态数据成员是同一个类中所有对象共享的成员,而不是某一对象的成员。因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。
二、如何定义一个静态数据成员
1.使用关键词static声明静态数据成员。(在类中)
2.对静态数据成员进行初始化。(在类外) 由于静态数据成员要分配空间,因此不能在类声明中进行初始化。静态数据成员初始化在类的外部进行,与一般数据成员的初始化不同。
static数据成员的初始化格式:
<数据类型> <类名>::<静态数据成员> = <值>;
静态数据成员的使用例子:
#include <iostream> using namespace std; class CObj { public: CObj() { mObjs++; } static int GetObjs() { return mObjs; } private: static int mObjs; //声明静态数据成员 }; int CObj::mObjs = 0; //静态数据成员的初始化 int main() { CObj objs[10]; cout << "CObj类总共创建了" << CObj::GetObjs() << "对象" << endl; return 0; }
执行结果:
CObj类总共创建了10对象
二、静态成员函数-->(没有this指针)
静态成员函数和静态数据成员一样,它们都属于类的静态成员,都不是对象成员。因此对静态成员的引用不需要用对象名,不过用对象名来引用也是可以的。
注:在静态成员函数的实现中,不能直接引用类中的非静态成员,可以引用类中说明的静态成员。但静态成员函数中可以间接的引用非静态成员,可以通过对象来引用。
来个例子,说明在 静态成员函数中,可以直接引用静态数据成员,但不能直接引用非静态数据成员,非静态数据成员必须通过对象来引用。
#include <iostream> using namespace std; class CObj { public: CObj() { mObjs_static++; } static void ShowData(CObj obj) { //mObjs_nonstatic = mObjs_static; //错误,不能直接引用非静态成员 obj.mObjs_nonstatic = mObjs_static; cout << "直接引用: " << "CObj类总共创建了" << mObjs_static << "对象" << endl; cout << "间接引用: " << "CObj类总共创建了" << obj.mObjs_nonstatic << "对象" << endl; } private: static int mObjs_static; //声明静态数据成员 int mObjs_nonstatic; }; int CObj::mObjs_static = 0; //静态数据成员的初始化 int main() { CObj obj1, obj2, obj3; obj1.ShowData(obj1); cout << endl; CObj::ShowData(obj2); return 0; }
执行结果:
直接引用: CObj类总共创建了3对象
间接引用: CObj类总共创建了3对象
直接引用: CObj类总共创建了3对象
间接引用: CObj类总共创建了3对象
三、const的static成员
上面已经说了,类的static数据成员,不能在类的声明中初始化,只能在类外进行初始化。但这里存在一种特殊情况,如果该静态数据成员是一个常量表达式,那么它就能够在类中进行初始化。
初始化的格式是:static const <数据类型> <变量名> = <值>;
例子:
#include <iostream> using namespace std; class CObj { public: static const int State_Mount = 0; static const int State_Umount = 1; }; int main() { cout << "State_Mount = " << CObj::State_Mount << endl << "State_Umount = " << CObj::State_Umount << endl << endl; CObj obj; cout << "State_Mount = " << obj.State_Mount << endl << "State_Umount = " << obj.State_Umount << endl; return 0; }
执行结果:
State_Mount = 0
State_Umount = 1
State_Mount = 0
State_Umount = 1