static 成員


對於基於相同類別產生的實例而言,會擁有各自的值域資料,不過有些資料不用實例各自擁有一份,而可以屬於類別,例如可以定義 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,可以用來組織 PItoRadian 等數學相關的常數或函式,若想使用數學上的這類東西,透過 Math 這名稱來取用,就會比較方便。