从IBM.com(https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzarg/cplr380.htm)
如果满足以下所有条件,则A类的析构函数是微不足道的:
- 它是隐式定义的
- A的所有直接基类都有琐碎的析构函数
- A的所有非静态数据成员的类都有琐碎的析构函数,如果满足以下所有条件,则A类的析构函数是琐碎的(不必要的):
解释:
该类中使用的构造函数已导入。在该类中没有创建新的构造函数。
在网站上:“直接基类是在其派生类的声明中直接作为基指定符出现的基类。”我想知道什么是基本说明符,兔子洞还在继续。请帮忙。
数据类型是原始的。
如果我的解释有误或为了清楚起见可以进一步简化,请发表评论。
class Foo {
public:
~Foo() { s = “”; x = 0; vi.clear(); }
private:
string s;
int x;
vector<int> vi;
};
鉴于创建如上所述的析构函数被认为是不好的做法,是否有一种简单的方法可以记住何时需要创建析构函数?
答案 0 :(得分:2)
零规则(来自cppreference):
具有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符的类应专门处理所有权(遵循“单一职责原则”)。其他类不应具有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符。
我喜欢cppreference对此非常明确。
要么编写一个只管理资源的类,要么什么都不做。在这种情况下,您确实需要阅读3/5规则(相同链接)。这应该很少见,因为已经有容器和智能指针为您管理资源。但是,应该启用RAII的“资源”不仅可以是内存,还可以是文件,DB连接等。
或者您编写不管理资源的类。在这种情况下,您无需编写析构函数。