澄清琐碎的破坏者

时间:2020-07-30 06:49:54

标签: c++ default destructor

从IBM.com(https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzarg/cplr380.htm

如果满足以下所有条件,则A类的析构函数是微不足道的:

  1. 它是隐式定义的
  2. A的所有直接基类都有琐碎的析构函数
  3. A的所有非静态数据成员的类都有琐碎的析构函数,如果满足以下所有条件,则A类的析构函数是琐碎的(不必要的):

解释:

  1. 该类中使用的构造函数已导入。在该类中没有创建新的构造函数。

  2. 在网站上:“直接基类是在其派生类的声明中直接作为基指定符出现的基类。”我想知道什么是基本说明符,兔子洞还在继续。请帮忙。

  3. 数据类型是原始的。

如果我的解释有误或为了清楚起见可以进一步简化,请发表评论。

class Foo {
public:
    ~Foo() { s = “”; x = 0; vi.clear(); }
private:
    string s;
    int x;
    vector<int> vi;
};

鉴于创建如上所述的析构函数被认为是不好的做法,是否有一种简单的方法可以记住何时需要创建析构函数?

1 个答案:

答案 0 :(得分:2)

零规则(来自cppreference):

具有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符的类应专门处理所有权(遵循“单一职责原则”)。其他类不应具有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符。

我喜欢cppreference对此非常明确。

要么编写一个只管理资源的类,要么什么都不做。在这种情况下,您确实需要阅读3/5规则(相同链接)。这应该很少见,因为已经有容器和智能指针为您管理资源。但是,应该启用RAII的“资源”不仅可以是内存,还可以是文件,DB连接等。

或者您编写不管理资源的类。在这种情况下,您无需编写析构函数。

相关问题