静态函数对类构造的好处

时间:2013-08-08 04:56:29

标签: c++ constructor

我见过这样的代码,所以我试图找到原因 使用静态函数作为构造函数而不是具有实际构造函数的主要原因是什么?

我的意思是:

class MyClass
{
    public:
    static MyClass CreateFrom( bar );
    static MyClass CreateFrom( foo );
    ...
}

而不是:

class MyClass
{
    public:
    MyClass( bar );
    MyClass( foo );
    ...
}

3 个答案:

答案 0 :(得分:10)

这称为“命名构造函数”。

通常在以下情况下使用:

  1. 你有很多具有足够相似的参数列表的ctors,过载的ctors会让人感到困惑(例如,整数和浮点数的不同混合,所以1, 1.0, 1应该意味着与{{1}不同的东西})。
  2. 您有两个不同的来源,它们都提供相同类型的输入。例如,假设您想要将地球表面上的距离转换为相距一定距离的点之间的距离 - 但您可能希望以英里或公里为单位提供距离,其中任何一个都将表示为1, 1, 1.0
  3. 在这种情况下,单个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)

最明显的好处是:

  • 当提供多个构造函数时,很容易指定在调用点构造实例的实现。这使得该类更容易提供多种变体。
  • 这些变体也可能有不同的名称,但是相同的参数列表(或者在确定选择哪个时,编译器可能会将其称为模糊的参数列表。)
  • 它可以帮助您,因为您可以在调用现场阅读实现调用的构造函数。

另一个原因是在某些情况下更容易在函数体内初始化类,而不是使用初始化列表。