所以我们正在进行一些同行评审,这种轻微的分歧上升了,
是否应该定义默认构造函数,即使它什么也不做,或者我们应该让编译器定义它?
到目前为止,没有任何一方能够提出任何重大优点或缺点。每种风格的优缺点是什么?哪种风格被认为是“清洁”?
答案 0 :(得分:10)
这可能会被视为“主要基于意见”,但我可以给你一些客观要点:
如果不定义默认构造函数,后来有人添加了带参数的构造函数并忘记添加无参数构造函数,默认构造函数将会消失,这可能会破坏现有代码。明确定义它可以确保即使有人稍后添加了重载的构造函数,无参数构造函数仍然存在。
如果构造函数在头文件中声明并且在行外定义(在.cc / .cpp文件中),则稍后可以使用仅需要重新链接的相关代码修改实现。在事实之后声明构造函数必然会影响标题,需要重新编译依赖代码。
明确定义它需要更多输入并产生更多代码行。有一个很小但非零的成本与此相关(输入时间,以及读者阅读代码所需的时间)。
除非您使用aggregate class,否则明确将该类视为取消=default
in C++11的资格。
是的,这些观点是矛盾的。我认为你会发现流行的意见 不来明确定义它,但就语言而言,没有正确或不正确的方法。 (除非你需要你的类型作为聚合。)
答案 1 :(得分:1)
你应该只实现你自己的默认构造函数,它只会执行编译器生成的任何其他内容。
如果您想给读者一个提示,可以在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,则编译器不会生成默认c。在这种情况下,你应该只提供一个默认的c&#39; tor 如果它有意义,从语义上来说 - 不是因为它&#34;很好&#34;有一个: - )
明确提供不必要的默认c&#39; tor
(-)
拥有更多必要的代码是不好的(o)
除非获得的清晰度超过较长的源代码(= default
)(-)
编译器生成的默认c&tor将接近最佳(-)
如果您开始提供不必要的成员(&#34;不必要&#34;,因为它会被生成),您最终会定义所有自动生成的成员,即default-c&#39 ; tor,析构函数,复制,移动,分配和移动分配。你真的不想结束那里。(-)
你知道是否应该用noexcept
标记默认的c&#tor; tor?编译器经常这样做。在编译器可以帮助你的地方,不要让你的大脑充满力量。我真的看不清楚(+)
,但那只是我。