静态成员

类的一般数据成员,每个对象都有这样一组数据成员,它们的空间是独立的。C++的类还有一种特殊的成员,它的空间是这个类的所有对象共享的,称为类静态数据成员

   1 class task {
   2 public:
   3     static unsigned n; //声明静态成员n
   4     int m;
   5 };
   6 unsigned task::n; //定义静态成员n
   7 int main() {
   8     task  t1, t2;
   9     t1.n = 10;
  10     cout << t2.n;
  11 }

这里n的空间在整个程序里面只有一个,t1,t2共享同一个n。

静态数据成员需要声明和定义。初始化不是在构造函数中进行,而是在定义的时候进行。访问静态数据成员可以和一般成员一样,通过对象名来访问,也可以不通过对象直接用类名来访问。

   1 class task {
   2 public:
   3     task() : x(n) { n++; }
   4     ~task() { n--; }
   5     int x;
   6     static unsigned n;
   7 };
   8 unsigned task::n = 1;// 初始化
   9 
  10 int main() {
  11     cout << task::n << endl;
  12     task s1;
  13     cout << s1.x << s1.n << endl;
  14     task s2;
  15     cout << s1.x << s1.n << endl;
  16     cout << s2.x << s2.n << endl;
  17     cout << task::n << endl;
  18 }

静态成员函数是只能访问静态成员(包括静态数据成员和静态成员函数)的成员函数。

   1 class task {
   2 private:
   3     static unsigned n;
   4 public:
   5     static unsigned get_count() {
   6         return n;
   7     }
   8 };
   9 unsigned task::n = 0;
  10 int main() {
  11     cout << task::get_count();
  12     task t;
  13     cout << t.get_count();
  14 }

静态成员用法举例:写一个类Singleton,这个类只能存在一个对象。

   1 class singleton{
   2 public:
   3     static  singleton &instance() {
   4         static singleton s;
   5         return s; 
   6     }
   7 private:
   8     singleton() { /*...*/ }
   9     singleton(singleton&){ /*...*/ }
  10 };

统计所有学生的平均成绩:

   1 class student {
   2     string name;
   3     string num;
   4     float score;
   5     static float sum;
   6     static int count;
   7 public:
   8     student(string na, string nu, float sc) 
   9         : name(na), num(nu), score(sc) {
  10         count ++;
  11         sum += score;
  12     }
  13     static float average() {
  14         return sum / count;
  15     }
  16 };
  17 
  18 float student::sum = 0;
  19 int student::count = 0;
  20 
  21 int main() {
  22     cout << student::average();
  23     student a("Jack", "0511001", 59);
  24     cout << a.average() << Student::average();
  25     student b("Lisa", "0511002", 99);
  26     cout << a.average() << b.average() << Student::average();
  27 }


CategoryCpp

C++:静态成员 (last edited 2008-03-13 20:58:33 by czk)

ch3n2k.com | Copyright (c) 2004-2022 czk.