【问题标题】:Should i define the default constructor? [closed]我应该定义默认构造函数吗? [关闭]
【发布时间】:2014-03-04 22:01:08
【问题描述】:

所以我们进行了一些同行评审,结果这个小分歧出现了,

是否应该定义默认构造函数,即使它什么都不做,还是应该让编译器定义它?

到目前为止,双方都无法提出任何主要的优势或劣势。每种风格的优缺点是什么,哪一种被认为是“更干净”?

【问题讨论】:

  • @nosid 这有关系吗?但是 c++11 就可以了
  • 定义它有一个优点吗?两个缺点是:需要维护和混淆的代码更多,实际上你可能会弄错,至少是 C++03。
  • @user1708860 在 C++11 中,您可以在构造函数中使用“=default”。
  • 让我们这样说吧:带有不必要的用户提供的默认构造函数的代码不太可能通过我正在进行的任何代码审查:-)
  • 询问具体的利弊使得这是一个有效的、非基于意见的问题。

标签: c++ coding-style


【解决方案1】:

这很可能以“主要基于意见”而结束,但我可以给你一些客观的观点来考虑:

    1234563现有代码。显式定义它可以确保即使后来有人添加了重载的构造函数,无参数的构造函数仍然存在。
  • 如果构造函数在标头中声明并在外部定义(在 .cc/.cpp 文件中),则稍后可以使用依赖代码修改实现,只需重新链接即可。事后声明构造函数必然会影响标头,需要重新编译相关代码。

    • 仍然需要调用一个空的外联构造函数,这会产生很小的运行时成本,而使用隐式提供的默认构造函数,编译器可以看到不需要做任何事情并避免调用。

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

  • 明确定义它会使该类无法成为aggregate class,除非您使用=default in C++11

是的,这些观点是矛盾的。我想你会发现流行的观点明确定义的,但就语言而言,没有正确或不正确的方式。 (除非你需要你的类型是一个聚合。)

【讨论】:

  • 如果您不确定用户提供的构造函数是否与编译器生成的构造函数相同,则不能说没有性能/行为差异。
  • @juanchopanza OP 专门讨论了无参数构造函数什么都不做的情况;所以不,没有区别。
  • @user2079303 用户声明!= 用户定义。你可以有明确的默认构造函数,它仍然是一个聚合。
  • @juanchopanza 我明白了,但我认为 not 是一个“不做任何事情”的构造函数。它通过初始化Bar::a 来做一些事情。也许我们可以规定,对于这个答案的范围,构造函数有一个空的主体并且没有初始化列表?
  • @user1708860:因为 1)这本身并不是一个非常完整的答案,2)我不想抄袭这个答案中的其他观点来做出一个完整的答案,3)这个答案应该更新,以免误导读者。
【解决方案2】:

没有任何用户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'tor,编译器将不会生成默认 c'tor。在这种情况下,你应该只提供一个默认的 c'tor 如果它有意义,语义上 - 不是因为有一个“很好” :-)

优点和缺点

显式提供一个不必要的默认 c'tor

  • (-) 需要更多代码是很糟糕的
  • (o) 除非获得的清晰度超过更长的源代码 (= default)
  • (-) 编译器生成的默认 c'tor 将接近最优
  • (-) 如果您开始提供不必要的成员(“不必要”,因为它会被生成),您稍后会定义所有自动生成的成员,即 default-c'tor、析构函数、复制、移动、分配和移动-分配。你真的不想在那里结束。
  • (-) 你知道是否应该用noexcept 标记默认c'tor 吗?编译器经常这样做。不要在编译器可以帮助你的地方浪费你的脑力。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2011-04-08
    相关资源
    最近更新 更多