C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系.
谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成员,static数据成员是存储在程序的静态存储区,而并不是在栈空间上。既然是static数据成员,所以关键字static是必不可少的,例如:
class Sum { public: Sum() {num++; sum+=num;} static void Reset() {num = 0; sum = 0;} static int GetSum() {return sum;} private: static int num; static int sum; };
需要特别注意的是:
在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义!
而且static数据成员不是通过类构造函数进行初始化的,它的成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的,初始化了之后,就可以使用static数据成员了
int Sum::num = 0; int Sum::sum = 0;
我们甚至可以这样使用:
int SS(int i) { Sum::Reset(); // 没有实例对象,却可以在这里使用 Sum *p = new Sum[i]; delete []p; p = NULL; return Sum::GetSum(); // 没有实例对象,却可以在这里使用 }
说到static数据成员,有一种情况不得不提,那就是特殊的const static成员。
如上面所述,类的static成员,像普通数据成员一样,不能在类的定义体中进行初始化。只能在类外进行初始化。const int 型的static成员便可以在类定义体内部进行初始化。记住一定只能是const int或者const char型的,换成const string ,double都不行。
class Sum { public: Sum() {num++; sum+=num;} static void Reset() {num = 0; sum = 0;} static int GetSum() {return sum;} private: static int num; static int sum; static const int i = 10; // ok static const char i = 10; // ok static const double i = 10; //Error static const string i = 10; //Error };
在C++Primer里面有一段注解:const static数据成员在类的定义体中进行了初始化后,还必须在类的定义体之外进行定义。其实这是可要可不要的。
说完了static成员后,我们再来看看static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。
class Sum { public: Sum() {num++; sum+=num;} static void Reset() {num = 0; sum = 0;} static int GetSum() { return sum; // OK 因为是static成员 return i; // Error 因为非static } private: static int num; static int sum; int i; };