static關鍵字(C++)
參考 https://blog.csdn.net/guotianqing/article/details/79828100#commentsedit
文章目錄
- static關鍵字(C++)
-
- 1. 靜态資料成員
-
- 1.1 概念
- 1.2 靜态資料成員的初始化和通路
- 1.3 靜态資料成員的好處
- 2. 靜态成員函數
-
- 2.1 概念
- 2.2 靜态成員函數調用
- 3. sizeof 遇到類靜态資料成員
1. 靜态資料成員
1.1 概念
在類内資料成員的聲明前加上 static 關鍵字,該資料成員就是類内的靜态資料成員。其特點如下:
靜态資料成員存儲在全局資料區,靜态資料成員在定義時配置設定存儲空間,是以不能在類聲明中定義
靜态資料成員是類的成員,無論定義了多少個類的對象,靜态資料成員的拷貝隻有一個,且對該類的所有對象可見。也就是說任一對象都可以對靜态資料成員進行操作。而對于非靜态資料成員,每個對象都有自己的一份拷貝。
和普通資料成員一樣,靜态資料成員也遵從 public, protected, private 通路規則
由于上面的原因,靜态資料成員不屬于任何對象,在沒有類的執行個體時(
執行個體就是建立對象
)其作用域就可見,在沒有任何對象時,就可以進行操作。
1.2 靜态資料成員的初始化和通路
靜态資料成員的初始化格式:<資料類型><類名>::<靜态資料成員名>=<值>
int Myclass::sum = 0; //在類外進行初始化,不需要也不允許再加 static 關鍵字
類的 公有靜态資料成員(
私有靜态資料成員隻能通過類的方法通路
)有兩種通路方式:
<類對象名>.<靜态資料成員名> 或 <類類型名>::<靜态資料成員名>
class Myclass
{
static int sum;
};
int x = Myclass::sum; //通過類名通路
Myclass M;
int y = M.sum; //通過類對象通路
1.3 靜态資料成員的好處
同全局變量相比,使用靜态資料成員有兩個優勢:
- 靜态資料成員沒有進入程式的全局名字空間,是以不存在與程式中其它全局名字沖突的可能性
- 可以實作資訊隐藏。靜态資料成員可以是 private 成員,而全局變量不能
2. 靜态成員函數
2.1 概念
公有的靜态資料成員可以直接通路,但私有的或保護的靜态資料成員卻必須通過公有的接口進行通路,一般将這個公有的接口定義為靜态成員函數。
在類中的 static 成員函數屬于整個類所擁有,這個函數 不接受 this 指針 (靜态成員函數并不屬于任一對象,是以,自然也不能通路非晶态資料成員),隻能通路類的 static 成員變量和調用靜态成員函數。如果想要通路非靜态成員,可以通過對象來引用。
靜态成員函數可以在類體内定義,也可以在類體外定義。當在類外定義時要注意不要加 static 關鍵字作字首。
2.2 靜态成員函數調用
和靜态資料成員一樣,靜态成員函數是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜态成員函數,要用類名和域運算符“∷”
非靜态成員函數可以任意地通路靜态成員函數和靜态資料成員
私有靜态成員函數不能通過類名調用,隻能被其他靜态函數調用。
示例代碼
#include <iostream>
using namespace std;
class M
{
public:
M(int a){ m_a = a; ms_b += a;} //構造函數
static void f1(M m); //公有靜态成員函數
private:
int m_a;
static int ms_b; //私有靜态成員變量
};
int M::ms_b = 0; //靜态資料初始化
void M::f1(M m) //靜态成員函數體
{
cout << "A=" << m.m_a <<endl; //通過對象引用非靜态成員
cout << "B=" << ms_b << endl; //直接引用靜态資料成員
}
int main()
{
M P(5);
M::f1(P);
return 0;
}
3. sizeof 遇到類靜态資料成員
sizeof 計算的是堆棧空間中的區域,是以對于類中的靜态成員占據的空間是不計算的
#include <iostream>
using namespace std;
class Myclass
{
public:
Myclass (int a,int b);
private:
int m_a;
int m_b;
static int sum;
};
int Myclass::sum = 0;
Myclass::Myclass(int a,int b)
{
m_a = a;
m_b = b;
}
int main()
{
Myclass M(3,7);
cout << sizeof(M); //結果為8
}