我应该定义默认构造函数吗?

时间:2014-03-04 22:01:08

标签: c++ coding-style

所以我们正在进行一些同行评审,这种轻微的分歧上升了,

是否应该定义默认构造函数,即使它什么也不做,或者我们应该让编译器定义它?

到目前为止,没有任何一方能够提出任何重大优点或缺点。每种风格的优缺点是什么?哪种风格被认为是“清洁”?

2 个答案:

答案 0 :(得分:10)

这可能会被视为“主要基于意见”,但我可以给你一些客观要点:

  • 如果定义默认构造函数,后来有人添加了带参数的构造函数并忘记添加无参数构造函数,默认构造函数将会消失,这可能会破坏现有代码。明确定义它可以确保即使有人稍后添加了重载的构造函数,无参数构造函数仍然存在。

  • 如果构造函数在头文件中声明并且在行外定义(在.cc / .cpp文件中),则稍后可以使用仅需要重新链接的相关代码修改实现。在事实之后声明构造函数必然会影响标题,需要重新编译依赖代码。

    • 仍然需要调用空的外部构造函数,从而产生较小的运行时成本,而使用隐式提供的默认构造函数,编译器可以看到不需要执行任何操作并避免调用。

  • 明确定义它需要更多输入并产生更多代码行。有一个很小但非零的成本与此相关(输入时间,以及读者阅读代码所需的时间)。

  • 除非您使用aggregate class,否则明确将该类视为取消=default in C++11的资格。

是的,这些观点是矛盾的。我认为你会发现流行的意见 来明确定义它,但就语言而言,没有正确或不正确的方法。 (除非你需要你的类型作为聚合。)

答案 1 :(得分:1)

没有任何用户c' tors

你应该只实现你自己的默认构造函数,它只会执行编译器生成的任何其他内容。

如果您想给读者一个提示,可以在C ++ 11中用= default替换实现。

struct MyObject {
    // only members that the compiler initializes fine 
    std::vector<int> data_;
    MyObject() = default;
};

或者,如果你不想那么冗长(或者在C ++ 11之前):

struct MyObject {
    // only members that the compiler initializes fine 
    std::vector<int> data_;
};

与其他用户c&#39; tors

如果您提供任何其他c,则编译器不会生成默认c。在这种情况下,你应该只提供一个默认的c&#39; tor 如果它有意义,从语义上来说 - 不是因为它&#34;很好&#34;有一个: - )

优点和缺点

明确提供不必要的默认c&#39; tor

  • (-)拥有更多必要的代码是不好的
  • (o)除非获得的清晰度超过较长的源代码(= default
  • (-)编译器生成的默认c&tor将接近最佳
  • (-)如果您开始提供不必要的成员(&#34;不必要&#34;,因为它会被生成),您最终会定义所有自动生成的成员,即default-c&#39 ; tor,析构函数,复制,移动,分配和移动分配。你真的不想结束那里。
  • (-)你知道是否应该用noexcept标记默认的c&#tor; tor?编译器经常这样做。在编译器可以帮助你的地方,不要让你的大脑充满力量。

我真的看不清楚(+),但那只是我。