01 基本概念 靜態成員:在定義前面加了static關鍵詞的成員。 cpp A p = new A(); p PrintNum(); cpp A a; A & ref = a; ref.PrintNum(); 03 小結 靜態成員變數本質上是全局變數,哪怕一個對象都不存在,類的靜態成員變數也存在。 ...
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 小結
- 靜態成員變數本質上是全局變數,哪怕一個對象都不存在,類的靜態成員變數也存在。
- 靜態成員函數本質上是全局函數。
- 設置靜態成員這種機制的目的是將和某些緊密相關的全局變數和函數寫在類裡面,看上去像是一個整體,易於維護和理解。
- 在靜態成員函數中,不能訪問非靜態成員變數,也不能調用非靜態成員函數。
- 靜態成員必須在定義類的文件中對靜態成員變數進行初始化,否則會編譯出錯。