C++ 编程
外观
声明为静态的成员函数或变量在对象类型的所有实例之间共享。这意味着对于任何对象类型,成员函数或变量只有一份副本存在。
- 无需对象即可调用的成员函数
在类函数成员中使用时,该函数不接受实例作为隐式 this
参数,而是像自由函数一样工作。这意味着静态类函数可以在不创建类实例的情况下调用。
class Foo {
public:
Foo() {
++numFoos;
cout << "We have now created " << numFoos << " instances of the Foo class\n";
}
static int getNumFoos() {
return numFoos;
}
private:
static int numFoos;
};
int Foo::numFoos = 0; // allocate memory for numFoos, and initialize it
int main() {
Foo f1;
Foo f2;
Foo f3;
cout << "So far, we've made " << Foo::getNumFoos() << " instances of the Foo class\n";
}
命名构造函数是使用静态成员函数的一个很好的例子。命名构造函数 是用于在不(直接)使用其构造函数的情况下创建类对象的函数的名称。这可能用于以下情况
- 规避构造函数只能在签名不同时才能重载的限制。
- 通过将构造函数设为私有来使类不可继承。
- 通过将构造函数设为私有来阻止堆栈分配。
声明一个使用私有构造函数创建对象并返回对象的静态成员函数。(它也可以返回指针或引用,但这似乎毫无用处,并且将其变成了工厂模式 而不是传统的命名构造函数。)
以下是一个存储可以以任何温度标度指定的温度的类的示例。
class Temperature
{
public:
static Temperature Fahrenheit (double f);
static Temperature Celsius (double c);
static Temperature Kelvin (double k);
private:
Temperature (double temp);
double _temp;
};
Temperature::Temperature (double temp):_temp (temp) {}
Temperature Temperature::Fahrenheit (double f)
{
return Temperature ((f + 459.67) / 1.8);
}
Temperature Temperature::Celsius (double c)
{
return Temperature (c + 273.15);
}
Temperature Temperature::Kelvin (double k)
{
return Temperature (k);
}