为什么构造函数不能在 c++ 中声明为静态?

Why can't constructor be declared as static in c++?

本文关键字:声明 静态 c++ 构造函数 不能 为什么      更新时间:2023-10-16

我最近读完了Bruce Eckel的《C++思维》第一卷,现在开始将这些知识应用到一些实际应用中。

我最近在处理静态成员函数,并尝试将构造函数设置为静态,但编译器对此并不满意。我在书中查了一下原因,但没有找到。

有人能解释一下原因吗?

附言:在看到一些回应后,我想提到的是,我知道C#(和Java)允许构造函数被声明为静态的,这让我感到困惑。

构造函数的目的是初始化类的实例的内容。

静态方法没有与之关联的实例。

因此不存在静态构造函数。

该语言本身不提供此类功能,但可以间接模拟。有关详细信息,请参阅此答案。我并不是真的很确定你为什么需要做这样的事。

构造函数成员函数使用现有分配(即存在this)按照指定构造对象。

static成员函数不指定对象的存储,因此不存在要构造的关联实例,即不存在this。因此,不能指定静态构造函数。

也许您正在寻找一个按值返回实例的命名静态成员函数:

class t_object {
public:
  static t_object Func(…optional parameter list…) {
    t_object result(…ctor parameters…);
    …initialize result…
    return result;
  }
  ...
};

C++over C的一个非常有用的特性是,当创建用户定义类型的实例时,它为正确的初始化和清理提供了一种正确的方法,这样您就可以开始使用一个格式良好的对象。

该语言通过构造函数和析构函数的机制来实现这一点。

正如您可能注意到的,构造函数和析构函数存在的原因是为了维护所创建的实例。

现在static暗示或至少在存在所有对象都可以使用的公共对象时使用。当确实存在要在您创建的类的所有实例之间共享的内容时,可以使用它。

类的静态数据成员的接口是通过静态成员函数提供的,这些函数主要用于静态数据成员。

因此,如果允许构造函数成为静态的,那么它可能意味着什么,从而使其成为静态的定义是still,这是它出现在图片中的原因(在你抓住它之前正确初始化对象)。因此,如果没有对象,那么使用构造函数/析构函数是没有意义的。

如果你在上面的行中思考,那么允许构造函数是静态的是没有任何意义的,至少在这种情况下(在C++中)是这样。因此,这种语言不支持它。

构造函数用于在创建类或对象实例时初始化该实例的成员变量。另一方面,类的静态方法不依赖于类的实例。

即使我们被允许使用实例和"."调用静态成员函数(点)运算符,建议我们使用类名和范围解析运算符"::"调用静态成员

如果你想创建一个静态方法来创建对象并返回它们,你当然可以这样做。但它不能是构造函数。