类static成员

 

static成员引进:有时特定类的全体对象需要访问一个全局对象。

 

为什么用static成员而不是全局对象?

       ---- static对象名字在类作用域中,可以有效避免命名冲突,并且清晰显示程序意图。

       ---- 可以实施封装(static成员可以定义为private,而全局对象不可以)

 

如何调用?     ---- class A a; A::static_mem; a.static_mem;

 

声明和定义

       ---- static成员函数在类定义体内部外部定义均可。在类定义体外定义时不加(不可以加)static修饰。

       ---- static数据成员必须在类定义体外部定义(正好一次)(在类定义体外声明并定义)

              class A{public : static int n;} int A::n = 10;

       ---- const static数据成员可以(也可以不)在类定义内初始化,但必须在类定义体外部重新声明(不可以加static修饰符,不可以赋初值)

 

static数据成员其他特性:

       ----一般地,在类的内部不能有该类类型的变量(或函数形参),最多只能有该类类型的指针或引用做变量类型(或函数形参).  static数据成员则不受这个限制。

       ---- 类的static数据成员可以作为函数默认实参 

       ---- static成员的继承:如果基类有static成员,则整个继承层次中只有一个这样的成员。每个static成员总是只有一个实例。
     

 1#include <iostream> 
 2#include <cstdlib>
 3
 4using namespace std; 
 5
 6class A
 7{
 8      //重载输出操作符 
 9      friend ostream& operator<<(ostream& outconst A&a)
10      {
11             out << a.m;
12             return out;
13      }

14      
15private:
16        int m ;
17 
18public:
19       A(int i) { m = i;}
20       
21       static int n;  
22       
23       static A a; //类可以有该类类型的static成员
24       //A a1; //error. 类不可以有普通的该类类型的成员            
25       
26       static void func(A a) {cout << a << endl;} //类类型可以作为该类static函数的形参   
27       
28       //static 数据成员可以作为类成员函数的默认实参 
29       static void func2(int i = n) { cout << i*<<endl;}    
30}
;
31
32int A::n = 10;
33A A::a(1);
34
35int main()
36{
37    cout << A::n << endl; //10
38    cout << A::a <<endl; //1
39    
40    A a2(3); 
41    A::func(a2); //3
42    A::func2(); //100
43 
44    system("pause");
45    return 0;
46}
 

 



幸运草 2010-01-08 12:22 发表评论
posted @ 2010-01-08 12:22  liyuxia713  阅读(142)  评论(0编辑  收藏  举报