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運算子不會計算靜態成員變數的大小,如下栗子:
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 小結
- 靜態成員變數本質上是全域變數,哪怕一個物件都不存在,類的靜態成員變數也存在,
- 靜態成員函式本質上是全域函式,
- 設定靜態成員這種機制的目的是將和某些緊密相關的全域變數和函式寫在類里面,看上去像是一個整體,易于維護和理解,
- 在靜態成員函式中,不能訪問非靜態成員變數,也不能呼叫非靜態成員函式,
- 靜態成員必須在定義類的檔案中對靜態成員變數進行初始化,否則會編譯出錯,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84923.html
標籤:C++
上一篇:C++ 成員物件和封閉類

