Статические функции очень полезны при реализации так называемых Именованных Конструкторов .
Представьте себе класс Point
, который может быть построен из прямоугольных координат (X / Y) или полярных координат.(радиус и угол):
class Point {
public:
Point(float x, float y); // Rectangular coordinates
Point(float r, float a); // Polar coordinates (radius and angle)
// ERROR: Overload is Ambiguous: Point::Point(float,float)
};
int main()
{
Point p = Point(5.7, 1.2); // Ambiguous: Which coordinate system?
...
}
Это можно очень хорошо решить, используя статические функции, которые создают Point
объекты;такие функции называются named constructors
, поскольку они действуют как конструктор (они создают новый объект), но могут иметь описательное имя:
class Point {
public:
// These static methods are the so-called "named constructors"
static Point rectangular(float x, float y) { return Point(x, y); }
static Point polar(float radius, float angle) { return Point(radius*std::cos(angle), radius*std::sin(angle)); }
// ...
private:
Point(float x, float y) : x_(x), y_(y) { }
float x_, y_;
};
Клиенты класса теперь могут использовать эти именованные конструкторы для создания читабельных, однозначный код:
int main()
{
Point p1 = Point::rectangular(5.7, 1.2); // Obviously rectangular
Point p2 = Point::polar(5.7, 1.2); // Obviously polar
}
Кроме того, именованные конструкторы можно использовать для проверки того, что объекты класса всегда выделяются с помощью new
(чтобы вы знали, что вы всегда можетевызовите удаление на них).См. FAQ [16.21] для получения дополнительной информации.