在一个类中(没有直接指针成员),我看到以下三种定义析构函数的可能性。
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)
吗?因为如果我使用选项(2)
,Clang-Tidy会提示我采用选项(1)
。
一般而言,三个不同选项之间有什么区别?选择一个以上时应考虑什么?
可以/应该始终避免选择(1)吗?
如果没有什么可放入析构函数的,则应让编译器为您生成一个default
析构函数,所以是。
一般而言,三个不同选项之间有什么区别?
假设不需要在析构函数中放置任何特殊内容:
您将destrucor锁定为空,如果情况发生变化,您可能会忘记将其添加到析构函数中。
让编译器弄清楚这一切,并在代码中显示您正在执行此操作。
让编译器将其全部弄清楚,并且不要在代码中显示您正在执行此操作。
可以/应该始终避免选择(1)吗?
是。据我所知,使用空非默认析构函数的唯一原因是支持C ++ 03和更早的标准。
选择一个之上的应考虑什么?
C ++使用RAII原理。密切相关的是The rule of three/five/zero。
它是这样的:
您肯定处于所有规则的零规则之内。因此,您需要具有隐式析构函数。