對於基於相同類別產生的實例而言,會擁有各自的值域資料,不過有些資料不用實例各自擁有一份,而可以屬於類別,例如可以定義 Math
類別,它提供了 PI
成員,因為 PI
是個常數,不需要個別實例擁有各自的 PI
。
class Math {
public:
constexpr static double PI = 3.14159;
};
static
資料成員屬於類別,而非個別實例,想在類別內初始 static
資料成員的話,必須是個 constexpr
,也就是必須是編譯時期常數,若否,必須在類別外指定,例如:
class Math {
public:
static double PI;
};
double Math::PI = 3.14159;
static
成員屬於類別,可以使用類別名稱加上 ::
解析運算子來存取:
cout << Math::PI << endl;
也可以宣告 static
函式成員,同樣地,會是屬於類別擁有,而不是類別的實例,例如來定義一個角度轉徑度的 toRadian
:
#include <iostream>
using namespace std;
class Math {
public:
constexpr static double PI = 3.14159;
static double toRadian(double);
};
double Math::toRadian(double angle) {
return PI / 180 * angle;
}
int main() {
cout << Math::PI << endl;
cout << Math::toRadian(30) << endl;
return 0;
}
static
成員屬於類別,同樣地,可以使用類別名稱加上 ::
解析運算子來呼叫 static
函式成員。
由於 static
成員是屬於類別而不是實例,呼叫靜態函式時,並不會傳入實例位址,也就是 static
函式中不會有 this
指標,因此 static
函式中不允許使用非 static
成員,因為沒有 this
可以使用。
static
成員屬於類別,某些程度上,就是將類別當成是一種名稱空間,用來組織一組相關的值或函式,像這邊的 Math
,可以用來組織 PI
、toRadian
等數學相關的常數或函式,若想使用數學上的這類東西,透過 Math
這名稱來取用,就會比較方便。