为什么命名构造函数是静态的

时间:2013-07-21 05:18:33

标签: c++

我正在阅读有关Named Constructors的帖子。它声明了命名构造函数是静态的。可能是什么原因。非静态方法不会起到同样的作用吗?

4 个答案:

答案 0 :(得分:14)

非静态函数与类的对象相关联。

在这种情况下,函数的整个要点是创建类的对象。当您调用该函数时, 没有与该函数调用相关联的类的实例。

答案 1 :(得分:3)

他们必须是static方法。

class Point {
public:
  static Point rectangular(float x, float y);      // Rectangular coord's
  static Point polar(float radius, float angle);   // Polar coordinates

  ...
private:
  Point();
  Point(float x, float y);     // Rectangular coordinates
  float x_, y_;
};

Named Constructor Idiom 中,您应该构建构造函数privateprotected,这样就不能直接构造一个构造对象。< / p>

另一方面,static方法不需要调用对象,因此它们也不需要构造函数。

因此,您可以使用static方法执行某些操作,例如返回构造对象。

答案 2 :(得分:1)

它不是某些“魔法语法”的一部分。它只是一个静态成员,作为类的工厂。我将从此链接复制示例并添加解释注释:

#include <cmath>               // To get std::sin() and std::cos()

class Point {
public:
  static Point rectangular(float x, float y);      // Its a static function that returns Point object
  static Point polar(float radius, float angle);   // Its a static function that returns Point object
  // These static methods are the so-called "named constructors"
  ...
private:
  Point(float x, float y);     // Rectangular coordinates
  float x_, y_;
};

inline Point::Point(float x, float y)
  : x_(x), y_(y) { }

inline Point Point::rectangular(float x, float y)
{ return Point(x, y); } //Create new Point object and return it by value

inline Point Point::polar(float radius, float angle)
{ return Point(radius*std::cos(angle), radius*std::sin(angle)); } //Create new Point object and return it by value

因此,Point::rectangularPoint::polar只是类

的工厂

答案 3 :(得分:0)

嗯,从某种意义上说它实际上可以。命名构造函数实际上是将工厂合并到目标类型的结果。在原始工厂模式中,您将具有以下内容:

class PointFactory {
public:
  Point rectangular(float x, float y);      // Rectangular coord's
  Point polar(float radius, float angle);   // Polar coordinates
  // Of course these *could* be static, but they don't *have* to be.
private:
  /* ... */
};

如果你想要的只是创建一个Point并且不需要复杂的工厂类型,你可以简单地将工厂的功能移动到Point类型本身。然后你必须根据其他答案中陈述的原因制作当时的“命名构造函数”成员函数static