難纏的老朋友-static關鍵字

static關鍵字

自以為是的碎碎念

總得來說,static關鍵字使得修飾的部分存儲在靜態(tài)區(qū),并且在程序執(zhí)行過程中,不會因為自身的作用域而被自動釋放銷毀,而是一直存在,但并不意味著它能被越域訪問;
舉個例子,靜態(tài)局部變量并不會因為所在的函數被執(zhí)行完成后被釋放銷毀,但它也只能被該函數訪問調用,而不能被別的函數訪問,即我上述的越域;

針對這一現象,我現在對于域的理解為一個訪問權的范圍,而static處理的則是生命周期的問題,以一個函數體為例;

一個函數A的普通的局部變量a,其訪問權在函數A手上,當函數A執(zhí)行完畢后,局部變量a會被釋放并銷毀;而加上關鍵字static后,靜態(tài)變量a不會再因為函數A的執(zhí)行完畢而被動態(tài)釋放銷毀,但對于變量a的訪問權依舊在函數A手上,只是變量a會在程序執(zhí)行期間一直存在靜態(tài)區(qū),延長了其生命周期;

還需要強調的是,靜態(tài)變量只會在第一次進行初始化,后續(xù)的數據操作對象是之前的變量的值;

有了上述的結論,就不難理解靜態(tài)局部和靜態(tài)全局變量的機制了。


靜態(tài)成員變量

我們可以使用 static 關鍵字來把類成員定義為靜態(tài)的。當我們聲明類的成員為靜態(tài)時,這意味著無論創(chuàng)建多少個類的對象,靜態(tài)成員都只有一個副本。

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

實例

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

#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;
         // 每次創(chuàng)建對象時增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // 長度
      double breadth;    // 寬度
      double height;     // 高度
};
 
// 初始化類 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
 
   // 輸出對象的總數
   cout << "Total objects: " << Box::objectCount << endl;
 
   return 0;
}

當上面的代碼被編譯和執(zhí)行時,它會產生下列結果:

Constructor called.
Constructor called.
Total objects: 2

靜態(tài)成員函數

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

靜態(tài)成員函數只能訪問靜態(tài)成員數據、其他靜態(tài)成員函數和類外部的其他函數。

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

靜態(tài)成員函數與普通成員函數的區(qū)別:

  • 靜態(tài)成員函數沒有 this 指針,只能訪問靜態(tài)成員(包括靜態(tài)成員變量和靜態(tài)成員函數)。
  • 普通成員函數有 this 指針,可以訪問類中的任意成員;而靜態(tài)成員函數沒有 this 指針。

實例

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

#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;
         // 每次創(chuàng)建對象時增加 1
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
      static int getCount()
      {
         return objectCount;
      }
   private:
      double length;     // 長度
      double breadth;    // 寬度
      double height;     // 高度
};
 
// 初始化類 Box 的靜態(tài)成員
int Box::objectCount = 0;
 
int main(void)
{
  
   // 在創(chuàng)建對象之前輸出對象的總數
   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)建對象之后輸出對象的總數
   cout << "Final Stage Count: " << Box::getCount() << endl;
 
   return 0;
}

當上面的代碼被編譯和執(zhí)行時,它會產生下列結果:

Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容