初始化或构建

bob*_*obo 5 language-agnostic constructor

我正在审查一些代码,我看到了很多这样的代码:

class Foo
{
public:
  Foo()
  {
    // 'nuffin
  }

  void init()
  {
    // actual construction code
  }
} ;
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一优势是,如果你在不使用指针的情况下创建一个Foo,并且想要将其构造代码延迟到以后,那么你可以.

这是一个好主意还是一个坏主意?

Gra*_*row 3

总的来说,我同意这是应该避免的事情。但到目前为止,所有答案都没有解决初始化可能失败的可能性。构造函数不能失败,因此,如果构造函数分配内存、打开文件或执行任何其他可能失败的操作,则需要一种方法来告诉调用者发生了错误。如果在构造函数中进行初始化,则需要有一个标志来指示初始化是否成功,然后确保调用者检查该标志。

如果您有一个单独的 init() 例程,必须在其他任何操作之前调用该例程,则调用者更有可能检查返回代码,而不是didInitializationSucceed()在创建对象后调用方法。

  • 在 C++ 中,构造函数将抛出异常(正常情况)或返回 0(如果使用 (nothrow) 构造)。它不会留下部分构造的对象。 (2认同)