首页 > 代码库 > [015]staic成员及staic成员函数

[015]staic成员及staic成员函数

     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;};

 

[015]staic成员及staic成员函数