静态函数对类构造的好处

Benefits of Static Functions for Class Constructions

本文关键字:静态函数      更新时间:2023-10-16

我看到过这样的代码,所以我正在努力寻找原因
让静态函数充当构造函数而不是实际构造函数的主要原因是什么?

我的意思是:

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

而不是:

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

这被称为"命名构造函数习惯用法"。

它通常用于以下情况:

  1. 你有很多具有足够相似的参数列表的actor,重载的actor会令人困惑(例如,整数和浮点数的不同混合物,所以1, 1.0, 1应该意味着与1, 1, 1.0不同的东西)
  2. 您有两个不同的源,它们都以相同的类型提供输入。例如,假设您希望将地球表面的距离转换为相距该距离的点之间的夹角,但您可能希望以英里或公里为单位提供距离,其中任何一个都将表示为double

在这种情况下,单个angle(double dist)无法区分以公里和英里为单位的输入,但:angle_from_milesangle_from_kilomters可以很容易地做到这一点。

它们被称为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

最明显的好处是:

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

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