什么是默认的析构函数?

时间:2015-07-28 09:20:48

标签: c++ c++14

我可以理解默认的构造函数,因为用户定义的构造函数将禁用编译器生成的构造函数,使得对象非常容易复制等。

在析构函数的情况下,除了更改访问类别之外,还有什么用于定义默认的析构函数,因为没有用户定义的成员函数可以禁用它们(无论如何都不能超载析构函数)?

// Which version should I choose ? 
struct Example 
{
    //1. ~Example() = default; 
    //2. ~Example() {}
    //3. 
}; 

即使在虚拟析构函数的情况下,默认它们也不会使它们变得微不足道,所以它有什么用呢?

4 个答案:

答案 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)

一个用途是使析构函数protectedprivate同时保持类的重要性:只需在所需的访问说明符之后列出它。

另一个:在编写类时,一些程序员喜欢命令类的函数:例如构造函数,然后是析构函数,然后是非const“变异”成员,然后是const“访问者”成员,然后是static函数。通过能够显式地= default析构函数,您可以按预期的顺序列出它,并且在那里看的读者知道不会有另一个错位的版本。在大型课程中,可能会有一些纪录片/安全价值。

它还为您提供了一些可以添加注释的具体内容,这可以帮助某些文档工具实现与销毁相关的注释。