01 基本概念
靜態(tài)成員:在定義前面加了static關(guān)鍵詞的成員。
class A
{
public:
A(int a, int b):m_a(a),m_b(b)
{
num += m_a + m_b;
}
~A(){ }
void Fun(); // 普通成員函數(shù)
static void PrintNum() // 靜態(tài)成員函數(shù)
{
// 在靜態(tài)成員函數(shù)中痢士,不能訪問非靜態(tài)成員變量,也不能調(diào)用非靜態(tài)成員函數(shù)
std::cout << num << std::endl;
}
private:
int m_a; // 普通成員變量
int m_b; // 普通成員變量
static int num; // 靜態(tài)成員變量
};
// 靜態(tài)成員必須在定義類的文件中對靜態(tài)成員變量進行初始化,否則會編譯出錯星掰。
int A::num = 0;
int main()
{
A a1(1,1);
A::PrintNum(); // 訪問靜態(tài)函數(shù)
A a2(1,1);
A::PrintNum(); // 訪問靜態(tài)函數(shù)
return 0;
}
輸出結(jié)果
2
4
- 普通成員變量每個對象有各自的一份,而靜態(tài)成員變量一共就一份嫩舟,為所有對象共享氢烘。
這里需要注意的是sizeof
運算符不會計算靜態(tài)成員變量的大小,如下栗子:
class CTest
{
int n;
static int s;
};
則sizeof(CTest)
等于4
- 普通成員函數(shù)必須具體作用于某個對象家厌,而靜態(tài)成員函數(shù)并不具體作用于某個對象播玖。
- 因此靜態(tài)成員不需要通過對象就能訪問,因為他是共享的饭于。
02 如何訪問靜態(tài)成員
1) 類名::成員名
A::PrintNum();
2) 對象名.成員名
A a;
a.PrintNum();
3) 指針->成員名
A *p = new A();
p->PrintNum();
4) 引用.成員名
A a;
A & ref = a;
ref.PrintNum();
03 小結(jié)
- 靜態(tài)成員變量本質(zhì)上是全局變量蜀踏,哪怕一個對象都不存在,類的靜態(tài)成員變量也存在镰绎。
- 靜態(tài)成員函數(shù)本質(zhì)上是全局函數(shù)脓斩。
- 設(shè)置靜態(tài)成員這種機制的目的是將和某些緊密相關(guān)的全局變量和函數(shù)寫在類里面,看上去像是一個整體畴栖,易于維護和理解随静。
- 在靜態(tài)成員函數(shù)中,不能訪問非靜態(tài)成員變量,也不能調(diào)用非靜態(tài)成員函數(shù)燎猛。
- 靜態(tài)成員必須在定義類的文件中對靜態(tài)成員變量進行初始化恋捆,否則會編譯出錯。