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

 

posted @ 2014-11-25 18:06  依然冷月  阅读(282)  评论(0编辑  收藏  举报