C++ static靜態成員

01 基本概念

靜態成員:在定義前面加了static關鍵詞的成員。函數

class A
{
public:
    A(int a, int b):m_a(a),m_b(b)
    {
        num += m_a + m_b;
    }
    
    ~A(){ }
    
    void Fun();             // 普通成員函數
    static void PrintNum()  // 靜態成員函數
    {
        // 在靜態成員函數中,不能訪問非靜態成員變量,也不能調用非靜態成員函數
        std::cout << num << std::endl; 
    }
    
private:
    int m_a;         // 普通成員變量
    int m_b;         // 普通成員變量
    static int num;  // 靜態成員變量
};

// 靜態成員必須在定義類的文件中對靜態成員變量進行初始化,不然會編譯出錯。
int A::num = 0;

int main()
{
    A a1(1,1);
    A::PrintNum(); // 訪問靜態函數
    A a2(1,1);
    A::PrintNum(); // 訪問靜態函數
    
    return 0;
}

輸出結果指針

2
4
  • 普通成員變量每一個對象有各自的一份,而靜態成員變量一共就一份,爲全部對象共享。

這裏須要注意的是sizeof運算符不會計算靜態成員變量的大小,以下栗子:code

class CTest
{
    int n;
    static int s;
};

sizeof(CTest)等於4對象

  • 普通成員函數必須具體做用於某個對象,而靜態成員函數並不具體做用於某個對象
  • 所以靜態成員不須要經過對象就能訪問,由於他是共享的。

02 如何訪問靜態成員

1) 類名::成員名

A::PrintNum();

2) 對象名.成員名

A a;
a.PrintNum();

3) 指針->成員名

A *p = new A();
p->PrintNum();

4) 引用.成員名

A a;
A & ref = a;
ref.PrintNum();

03 小結

  • 靜態成員變量本質上是全局變量,哪怕一個對象都不存在,類的靜態成員變量也存在。
  • 靜態成員函數本質上是全局函數。
  • 設置靜態成員這種機制的目的是將和某些緊密相關的全局變量和函數寫在類裏面,看上去像是一個總體,易於維護和理解。
  • 在靜態成員函數中,不能訪問非靜態成員變量,也不能調用非靜態成員函數。
  • 靜態成員必須在定義類的文件中對靜態成員變量進行初始化,不然會編譯出錯。
相關文章
相關標籤/搜索