類的靜態成員/靜態成員函數/普通成員函數(C++語言)


一、類的靜態成員

  • 在c++類中聲明成員時可以加上static關鍵字,這樣聲明的成員就叫做靜態成員(包括數據成員和成員函數)。

  • 即聲明為static的類成員或者成員函數便能在類的范圍內同享

  • 當我們聲明類的成員為靜態時,這意味着無論創建多少個類的對象,靜態成員都只有一個副本

  • 如果不存在其他的初始化語句,在創建第一個對象時,所有的靜態數據都會被初始化為零。我們不能把靜態成員的初始化放置在類的定義中,但是可以在類的外部通過使用范圍解析運算符 :: 來重新聲明靜態變量從而對它進行初始化。

  • 舉例:

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      static int objectCount;
      // 構造函數定義
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
         // 每次創建對象時增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // 長度
      double breadth;    // 寬度
      double height;     // 高度
};
 
// 初始化類 Box 的靜態成員
int Box::objectCount = 0;
 
int main(void)
{
   Box Box1(3.3, 1.2, 1.5);    // 聲明 box1
   Box Box2(8.5, 6.0, 2.0);    // 聲明 box2
 
   // 輸出對象的總數
   cout << "Total objects: " << Box::objectCount << endl;
 
   return 0;
}

產生的結果如圖:


二、靜態成員函數

  • 如果把函數成員聲明為靜態的,就可以把函數與類的任何特定對象獨立開來。靜態成員函數即使在類對象不存在的情況下也能被調用,靜態函數只要使用類名加范圍解析運算符 :: 就可以訪問。

  • 靜態成員函數只能訪問靜態成員數據、其他靜態成員函數和類外部的其他函數

  • 靜態成員函數有一個類范圍,他們不能訪問類的 this 指針。可以使用靜態成員函數來判斷類的某些對象是否已被創建。

  • 利用以下實例來理解靜態成員函數:

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      static int objectCount;
      // 構造函數定義
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
         // 每次創建對象時增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
      static int getCount()
      {
         return objectCount;
      }
   private:
      double length;     // 長度
      double breadth;    // 寬度
      double height;     // 高度
};
 
// 初始化類 Box 的靜態成員
int Box::objectCount = 0;
 
int main(void)
{
  
   // 在創建對象之前輸出對象的總數
   cout << "Inital Stage Count: " << Box::getCount() << endl;
 
   Box Box1(3.3, 1.2, 1.5);    // 聲明 box1
   Box Box2(8.5, 6.0, 2.0);    // 聲明 box2
 
   // 在創建對象之后輸出對象的總數
   cout << "Final Stage Count: " << Box::getCount() << endl;
 
   return 0;
}


三、類的靜態函數和普通成員函數的區別

靜態成員函數沒有 this 指針,只能訪問靜態成員(包括靜態成員變量和靜態成員函數)。

普通成員函數有 this 指針,可以訪問類中的任意成員;而靜態成員函數沒有 this 指針。

類的靜態函數可以在未實例化前調用。

定義函數指針指向普通成員函數時,需要取類的地址,而調用時每一個實例有自己的函數指針。

用函數指針調用靜態成員函數時,僅需要指定類名。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM