我见过这样的代码,所以我试图找到原因 使用静态函数作为构造函数而不是具有实际构造函数的主要原因是什么?
我的意思是:
class MyClass
{
public:
static MyClass CreateFrom( bar );
static MyClass CreateFrom( foo );
...
}
而不是:
class MyClass
{
public:
MyClass( bar );
MyClass( foo );
...
}
答案 0 :(得分:10)
这称为“命名构造函数”。
通常在以下情况下使用:
1, 1.0, 1
应该意味着与{{1}不同的东西})。1, 1, 1.0
。在这种情况下,单个double
无法区分千米输入与英里数之间的输入,但是:angle(double dist)
和angle_from_miles
可以很容易地做到这一点。
答案 1 :(得分:7)
他们被称为Named Constructors
。
当你想要构造一个需要传递一组特定参数但在内部需要以不同方式构造对象的对象时,基本上使用它们。
例如,您有一个类:
class AREA
{
double area;
AREA(int x);
};
//how will you construct the object differently in case of circle and square??
为此,我们命名了有助于创建相关对象的构造函数。
因此我们可以在类中创建2个静态方法:
static AREA square(int x)
{ return AREA(x*x); }
和
static AREA circle(int x)
{ return AREA(x*x*3.14); } //or a more accurate PI value
因此,我们可以调用相关的静态函数来返回用所需区域初始化的对象。
注意:这些是静态的,因为在为特定类创建对象时,您不应该要求对象这样做。
检查 THIS 了解详情。
答案 2 :(得分:1)
最明显的好处是:
另一个原因是在某些情况下更容易在函数体内初始化类,而不是使用初始化列表。