程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 類的靜態成員(static)

C++ 類的靜態成員(static)

編輯:C++入門知識

  靜態成員的提出是為了解決數據共享的問題。實現共享有許多方法,如:設置全局性的變量或對象是一種方法。但是,全局變量或對象是有局限性的。這一章裡,我們主要講述類的靜態成員來實現數據的共享。
  
  靜態數據成員
  
   <!-- frame contents --> <!-- /frame contents -->   在類中,靜態成員可以實現多個對象之間的數據共享,並且使用靜態數據成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有對象中共享的成員,而不是某個對象的成員。
  
  使用靜態數據成員可以節省內存,因為它是所有對象所公有的,因此,對多個對象來說,靜態數據成員只存儲一處,供所有對象共用。靜態數據成員的值對每個對象都是一樣,但它的值是可以更新的。只要對靜態數據成員的值更新一次,保證所有對象存取更新後的相同的值,這樣可以提高時間效率。
  
  靜態數據成員的使用方法和注重事項如下:
  
  1、靜態數據成員在定義或說明時前面加要害字static。
  
  2、靜態成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式如下:
  
  <數據類型><類名>::<靜態數據成員名>=<值>
  
  這表明:
  
          (1) 初始化在類體外進行,而前面不加static,以免與一般靜態變量或對象相混淆。
  
  (2) 初始化時不加該成員的訪問權限控制符private,public等。
  
  (3) 初始化時使用作用域運算符來標明它所屬類,因此,靜態數據成員是類的成員,而不是對象的成員。
  
  3、靜態數據成員是靜態存儲的,它是靜態生存期,必須對它進行初始化。
  
  4、引用靜態數據成員時,采用如下格式:
  
   <類名>::<靜態成員名>
  
  假如靜態數據成員的訪問權限答應的話(即public的成員),可在程序中,按上述格式來引用靜態數據成員。
  
  下面舉一例子,說明靜態數據成員的應用:
  
   #include
  class Myclass
  {
  public:
  Myclass(int a, int b, int c);
  void GetNumber();
  void GetSum();
  private:
  int A, B, C;
  static int Sum;
  };
  
  int Myclass::Sum = 0;
  
  Myclass::Myclass(int a, int b, int c)
  {
  A = a;
  B = b;
  C = c;
  Sum += A+B+C;
  }
  
  void Myclass::GetNumber()
  {
  cout<<"Number="< }
  
  void Myclass::GetSum()
  {
  cout<<"Sum="<   }
  
  void main()
  {
  Myclass M(3, 7, 10),N(14, 9, 11);
  M.GetNumber();
  N.GetNumber();
  M.GetSum();
  N.GetSum();
  }
  
  從輸出結果可以看到Sum的值對M對象和對N對象都是相等的。這是因為在初始化M對象時,將M對象的三個int型數據成員的值求和後賦給了Sum,於是Sum保存了該值。在初始化N對象時,對將N對象的三個int型數據成員的值求和後又加到Sum已有的值上,於是Sum將保存另後的值。所以,不論是通過對象M還是通過對象N來引用的值都是一樣的,即為54。
  
  靜態成員函數
  
  靜態成員函數和靜態數據成員一樣,它們都屬於類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。
  
  在靜態成員函數的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員。假如靜態成員函數中要引用非靜態成員時,可通過對象來引用。下面通過例子來說明這一點。
  
   #include
  class M
  {
  public:
  M(int a) { A=a; B+=a;}
  static void f1(M m);
  private:
  int A;
  static int B;
  };
  
  void M::f1(M m)
  {
  cout<<"A="<   cout<<"B="<   }
  
  int M::B=0;
  void main()
  {
  M P(5),Q(10);
  M::f1(P); file://調用時不用對象名
  M::f1(Q);
  }
  
  讀者可以自行分析其結果。從中可看出,調用靜態成員函數使用如下格式:
  
   <類名>::<靜態成員函數名>(<參數表>);
  
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved