我可以理解默认的构造函数,因为用户定义的构造函数将禁用编译器生成的构造函数,使得对象非常容易复制等。
在析构函数的情况下,除了更改访问类别之外,还有什么用于定义默认的析构函数,因为没有用户定义的成员函数可以禁用它们(无论如何都不能超载析构函数)?
// Which version should I choose ?
struct Example
{
//1. ~Example() = default;
//2. ~Example() {}
//3.
};
即使在虚拟析构函数的情况下,默认它们也不会使它们变得微不足道,所以它有什么用呢?
答案 0 :(得分:3)
简单的析构函数省略的例外与派生的类'析构函数有关,而不是基础析构函数。所以virtual ~Foo() = default;
是一个有用的构造来保持默认的析构函数,但是虚拟化它。
答案 1 :(得分:1)
基本上它是关于传达意图,但非常多余。
但是如果您使用std::unique_ptr
作为班级成员,则需要在标题中声明析构函数(但仅声明)。然后你可以使它在源文件中使用默认实现,如下所示:
MyClass:~MyClass() = default;
考虑到你的选择,我会使用第一个或第三个。
答案 2 :(得分:1)
正如评论中Nikos Athanasiou所提到的,默认构造函数使得类型可以轻易地破坏,而用户定义的类型则不是。一个小代码示例将显示它:
#include <iostream>
#include <type_traits>
struct A { ~A() = default; };
struct B { ~B() {} };
struct C { ~C() noexcept {} };
int main() {
std::cout
<< std::is_trivially_destructible<A>::value
<< std::is_trivially_destructible<B>::value
<< std::is_trivially_destructible<C>::value
<< std::endl;
return 0;
}
显示
100
对于虚拟析构函数,与非虚拟析构函数的一致性和Quentin的答案是合适的原因。我个人的建议是,你应该尽可能使用默认值,因为这是一种坚持最规范行为的方式。
答案 3 :(得分:1)
一个用途是使析构函数protected
或private
同时保持类的重要性:只需在所需的访问说明符之后列出它。
另一个:在编写类时,一些程序员喜欢命令类的函数:例如构造函数,然后是析构函数,然后是非const
“变异”成员,然后是const
“访问者”成员,然后是static
函数。通过能够显式地= default
析构函数,您可以按预期的顺序列出它,并且在那里看的读者知道不会有另一个错位的版本。在大型课程中,可能会有一些纪录片/安全价值。
它还为您提供了一些可以添加注释的具体内容,这可以帮助某些文档工具实现与销毁相关的注释。