C++开发初级


983 浏览 5 years, 10 months

6.1 静态方法

版权声明: 转载请注明出处 http://www.codingsoho.com/

静态方法

与成员类似,方法有时会应用于全部类对象而不是单个对象,此时可以像使用静态成员那样使用静态方法。可以将第6章的SpreadsheetCell类作为示例,这个类有两个辅助方法:stringToDouble()以及doubleToString()。这些方法没有访问特定对象的信息,因此可以是静态的。下面的类定义将这些方法设置为静态:

class SpreadsheetCell
{
 protected:
  static string doubleToString(double inValue);
  static double stringToDouble(const string& inString);
};

代码取自 SpreadsheetCellMethods\SpreadsheetCell.h

这些方法没有声明为const,因为不允许将静态方法声明为const。这些方法的非静态版本可以标记为const 。

这两个方法的实现与前面的实现相同,在方法定义前不需要重复static关键字。然而,注意静态方法不属于特定对象,因此没有this指针,当用某个特定对象调用静态方法时,静态方法不会访问这个对象的非静态数据成员。实际上,静态方法就像一个 普通函数,唯一区别在于这个方法可以访问类的private以及protected静态数据成员。

如果同一类型的其他对象对于静态方法可见(例如传递了对象的指针或者引用),静态方法也可以访问其他对象的private以及protected非静态数据成员。

类中任何方法都可以像调用普通函数那样调用静态方法,因此SpreadsheetCell中所有方法的实现都没有改变。

如果要在类的外面调用静态方法,需要用类名称以及作用域解析运算符限定方法的名称(就像静态数据成员那样),静态方法的访问控制与普通方法一样。

您或许想将stringToDouble()以及doubleToString()设置为public,这样类外面的代码也可以使用它们。如果这样做的话,可在任意位置这样调用这两个方法:

string str = SpreadsheetCell::doubleToString(5);