C++ 類(lèi)的靜態(tài)成員

C++ 類(lèi) & 對(duì)象 C++ 類(lèi) & 對(duì)象

我們可以使用 static 關(guān)鍵字來(lái)把類(lèi)成員定義為靜態(tài)的。當(dāng)我們聲明類(lèi)的成員為靜態(tài)時(shí),這意味著無(wú)論創(chuàng)建多少個(gè)類(lèi)的對(duì)象,靜態(tài)成員都只有一個(gè)副本。

靜態(tài)成員在類(lèi)的所有對(duì)象中是共享的。如果不存在其他的初始化語(yǔ)句,在創(chuàng)建第一個(gè)對(duì)象時(shí),所有的靜態(tài)數(shù)據(jù)都會(huì)被初始化為零。我們不能把靜態(tài)成員放置在類(lèi)的定義中,但是可以在類(lèi)的外部通過(guò)使用范圍解析運(yùn)算符 :: 來(lái)重新聲明靜態(tài)變量從而對(duì)它進(jìn)行初始化,如下面的實(shí)例所示。

下面的實(shí)例有助于更好地理解靜態(tài)數(shù)據(jù)成員的概念:

#include <iostream>
 
using namespace std;

class Box
{
   public:
      static int objectCount;
      // 構(gòu)造函數(shù)定義
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
         // 每次創(chuàng)建對(duì)象時(shí)增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // 長(zhǎng)度
      double breadth;    // 寬度
      double height;     // 高度
};

// 初始化類(lèi) Box 的靜態(tài)成員
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

   // 輸出對(duì)象的總數(shù)
   cout << "Total objects: " << Box::objectCount << endl;

   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Constructor called.
Constructor called.
Total objects: 2

靜態(tài)函數(shù)成員

如果把函數(shù)成員聲明為靜態(tài)的,就可以把函數(shù)與類(lèi)的任何特定對(duì)象獨(dú)立開(kāi)來(lái)。靜態(tài)成員函數(shù)即使在類(lèi)對(duì)象不存在的情況下也能被調(diào)用,靜態(tài)函數(shù)只要使用類(lèi)名加范圍解析運(yùn)算符 :: 就可以訪問(wèn)。

靜態(tài)成員函數(shù)只能訪問(wèn)靜態(tài)數(shù)據(jù)成員,不能訪問(wèn)其他靜態(tài)成員函數(shù)和類(lèi)外部的其他函數(shù)。

靜態(tài)成員函數(shù)有一個(gè)類(lèi)范圍,他們不能訪問(wèn)類(lèi)的 this 指針。您可以使用靜態(tài)成員函數(shù)來(lái)判斷類(lèi)的某些對(duì)象是否已被創(chuàng)建。

下面的實(shí)例有助于更好地理解靜態(tài)函數(shù)成員的概念:

#include <iostream>
 
using namespace std;

class Box
{
   public:
      static int objectCount;
      // 構(gòu)造函數(shù)定義
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
         // 每次創(chuàng)建對(duì)象時(shí)增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
      static int getCount()
      {
         return objectCount;
      }
   private:
      double length;     // 長(zhǎng)度
      double breadth;    // 寬度
      double height;     // 高度
};

// 初始化類(lèi) Box 的靜態(tài)成員
int Box::objectCount = 0;

int main(void)
{
  
   // 在創(chuàng)建對(duì)象之前輸出對(duì)象的總數(shù)
   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

   // 在創(chuàng)建對(duì)象之后輸出對(duì)象的總數(shù)
   cout << "Final Stage Count: " << Box::getCount() << endl;

   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2

C++ 類(lèi) & 對(duì)象 C++ 類(lèi) & 對(duì)象