我正在阅读有关Named Constructors的帖子。它声明了命名构造函数是静态的。可能是什么原因。非静态方法不会起到同样的作用吗?
答案 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 中,您应该构建构造函数private
或protected
,这样就不能直接构造一个构造对象。< / 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::rectangular
和Point::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
。