跳转到内容

C++ 编程

来自 Wikibooks,开放世界中的开放书籍
静态成员函数
[编辑 | 编辑源代码]

声明为静态的成员函数或变量在对象类型的所有实例之间共享。这意味着对于任何对象类型,成员函数或变量只有一份副本存在。

无需对象即可调用的成员函数

在类函数成员中使用时,该函数不接受实例作为隐式 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";
}
命名构造函数
[编辑 | 编辑源代码]

命名构造函数是使用静态成员函数的一个很好的例子。命名构造函数 是用于在不(直接)使用其构造函数的情况下创建类对象的函数的名称。这可能用于以下情况

  1. 规避构造函数只能在签名不同时才能重载的限制。
  2. 通过将构造函数设为私有来使类不可继承。
  3. 通过将构造函数设为私有来阻止堆栈分配。

声明一个使用私有构造函数创建对象并返回对象的静态成员函数。(它也可以返回指针或引用,但这似乎毫无用处,并且将其变成了工厂模式 而不是传统的命名构造函数。)

以下是一个存储可以以任何温度标度指定的温度的类的示例。

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);
}

华夏公益教科书