8

我最近读完了第一卷。由 Bruce Eckel 撰写的 Thinking in C++ 的论文,现在已经转向将这些知识应用到一些实际用途中。

我最近在使用静态成员函数并尝试将构造函数设为静态,编译器对此并不满意。我查了书上的原因,但没有找到。

谁能解释为什么?

PS:在看到一些回复后,我想提一下,由于我知道 C#(和 Java)允许将构造函数声明为静态,因此产生了混淆。

4

5 回答 5

14

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

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

因此,没有静态构造函数之类的东西。

于 2013-07-06T07:38:55.513 回答
1

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

于 2013-07-06T07:39:13.483 回答
0

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

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

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

class t_object {
public:
  static t_object Func(…optional parameter list…) {
    t_object result(…ctor parameters…);
    …initialize result…
    return result;
  }
  ...
};
于 2013-07-06T07:51:36.870 回答
0

C++ 优于 C 的一个非常有用的特性是,它提供了一种在创建用户定义类型的实例时进行正确初始化和清理的正确方法,以便您准备好开始使用的格式良好的对象。

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

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

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

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

因此,如果允许将构造函数设为静态,那么它可能意味着什么,以便通过使其成为静态而赋予它的定义符合它still出现的原因(在你掌握之前正确初始化对象)它)。因此,如果没有对象,那么拥有构造函数/析构函数是没有意义的。

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

于 2013-08-31T08:28:42.860 回答
0

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

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

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

于 2021-06-28T02:30:04.870 回答