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这名称来取用,就会比较方便。


展开阅读全文