gpt4 book ai didi

c++ - 如何正确实现 C++ 类析构函数

转载 作者:行者123 更新时间:2023-12-02 03:45:33 26 4
gpt4 key购买 nike

在类(没有直接指针成员)中,我发现定义析构函数有以下 3 种可能性。

class Child : public Parent
{
public:
// ~Child() override {} // (1) explicit destructor with empty body
// ~Child() override = default; // (2) explicit default destructor
// // (3) implicit default destructor


private:
// members
}

是否可以/应该始终避免选项(1)?因为如果我使用选项 (1),Clang-Tidy 会提示我选择选项 (2)

这三种不同的选项通常有什么区别?选择其中之一时应考虑什么?

最佳答案

Can/should option (1) always be avoided?

假设该语言是非古代版本,是的。据我所知,使用空的非默认析构函数的唯一原因是支持 C++03 和旧标准。<​​/p>

What should be considered when selecting one over others?

    1. 和 3. 具有在所有版本的 C++ 中都有效的优势(不考虑 override 说明符)。
  • 和 3. 只要成员可以轻松地破坏,就具有简单的优势。
    1. 和 2. 的优点是允许析构函数与类定义分开定义(示例中没有利用这一点)。例如,如果您有一个指向不完整类型的唯一指针作为成员,这一点至关重要。这是实现 PIMPL 模式时的典型情况。
    1. 和 2. 还具有允许将析构函数显式声明为 virtual 的优点,这对于多态基类通常是必需的。
    1. 缺点是不推荐使用隐式声明的复制构造函数和赋值运算符。这意味着不应依赖它,并且将来可能会停止工作。 1. 和 2. 都有阻止隐式移动构造函数和赋值运算符生成的缺点。因此,如果您使用其中任何一个,那么您还应该声明复制和移动构造函数以及赋值运算符(如果可能,则使用默认值)。
  • 具有写入量和读取量最少的优点,特别是考虑到上一段。

作为粗略的经验法则,如果可能,请使用 3.。如果不可能(例如上面描述的 PIMPL 情况),则使用 2。如果不可能(即需要支持 C++03),则使用 1。

关于c++ - 如何正确实现 C++ 类析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58412354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com