默认析构函数的用途是什么?
What are defaulted destructors used for?
我可以理解默认构造函数,因为用户定义的构造函数将禁用编译器生成的构造函数,使对象不可复制等。
在析构函数的情况下,除了更改访问类别之外,考虑到没有用户定义的成员函数可以禁用默认析构函数(无论如何都不能重载析构函数),定义默认析构函数有什么用?
// Which version should I choose ?
struct Example
{
//1. ~Example() = default;
//2. ~Example() {}
//3.
};
即使在虚析构函数的情况下,默认它们也不会使它们变得微不足道,所以这样做有什么好处呢?
省略普通析构函数的例外与派生的类的析构函数有关,而与基类无关。因此,virtual ~Foo() = default;
是一个有用的构造,可以保留默认析构函数,但可以虚拟化它。
一种用法是使析构函数protected
或private
,同时可能保持类的不重要:只需在所需的访问说明符之后列出它。
另外:在编写类时,一些程序员喜欢对类的函数进行排序:例如,构造函数,然后是析构函数,然后是非const
"变异"成员,然后是const
"访问器"成员,然后是static
函数。通过显式地= default
析构函数,您可以按照预期的顺序列出它,并且查找它的读者知道不可能有另一个放错位置的版本。在大班中,这可能有一定的记录/安全价值。
它还为您提供了一些具体的东西来添加注释,这可以帮助一些文档工具意识到注释与销毁有关。
基本上是关于传达意图,但相当多余。
但是如果你使用std::unique_ptr
作为类的成员,你需要在header中声明析构函数(但只声明)。然后你可以让它在源文件中使用默认实现,如下所示:
MyClass:~MyClass() = default;
考虑到你的选择,我会用第一个或第三个
正如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的回答是恰当的理由。我个人的建议是,你应该尽可能使用默认值,因为这是一种坚持最规范行为的方法。
- C++:使用方法调用析构函数的顺序是什么?
- 在析构函数中删除单链表的正确方法是什么?
- 应该是虚拟析构函数吗?但是怎么做呢?
- 什么是带有友元说明符的析构函数
- 这是删除析构函数中的数组的正确方法吗?
- 在C++中为临时库调用析构函数的顺序是什么
- 虚拟析构函数的用途是什么
- Qt:写这个类的析构函数的正确和安全的方法是什么
- 在C++中,析构函数的调用顺序和成员变量的销毁顺序是什么
- C++11 中默认虚拟析构函数的异常规范是什么?
- 调用析构函数以释放C++运算符中的内存的正确方法是什么
- 这个枚举在析构函数中的用途是什么
- 为这个二进制节点类创建析构函数的正确方法是什么
- 我的析构函数需要在这个函数中是什么
- 当您有一个二维数组(C++)时调用析构函数的正确方法是什么?
- 传递到虚拟析构函数的这个额外参数是什么?
- 关于隐式删除虚析构函数的错误信息是什么?
- 变量或对象的内存在程序结束时自动终止,而不是使用析构函数
- 为什么是虚析构函数
- gcov报告的析构函数中的分支是什么?