在C++中,如果非RAII类具有用户定义的析构函数,那么它是一个好设计吗?非RAII类是否需要用户定义的析构函数?
-1
A
回答
0
如果类不需要释放任何资源(或执行任何操作),并且不需要为虚拟函数表创建空的析构函数,那么最好不要定义析构函数在所有(见零规则)。
1
有两个常见的“经验法则”涵盖了这一点。
第一个是五法则(在C++ 03中,规则三,因为没有任何移动)。如果您有复制构造函数,复制赋值运算符,析构函数,移动构造函数或移动赋值运算符中的任何一个,则需要编写或阻止其他每个运算符。
第二是规则零,其中指出,对于大多数类,不写一个拷贝构造函数,拷贝赋值运算符,析构函数,构造运动或移动赋值操作符。相反,请将您的资源存储在为您处理该问题的特殊用途子对象中。
规则为零可能是你所指的。
与大多数经验法则一样,这不是一条硬性规则,但它背后有智慧。一个工作是资源管理(你可能称之为RAII类)的类可以处理问题的来龙去脉,而不用关心其余的逻辑,通常是以零开销的方式做到这一点。然后你的外部类可以免除这种担忧。由于资源寿命管理是一个不平凡的问题,将其与其他问题隔离并单独进行测试可以帮助减少错误。但是,如果您的对象旨在从多态继承,它通常需要一个虚拟析构函数。它应该也可以阻止赋值,复制构造(至少公开),移动构造,移动赋值和复制赋值,至于多态类,这些很少有意义,并且可能导致切片问题。
拥有用户定义的析构函数的另一个原因是,如果你正在编写一个范围守护类,它往往不拥有任何资源。正确地执行一个范围守卫类是棘手的(并且如果没有新的C++异常展开检测支持 - 基本上确定一个范围守护类是否可以安全抛出几乎是不可能的)。
相关问题
- 1. 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?
- 2. 是否需要定义一个虚拟析构函数?
- 3. 如果后代类没有非静态成员或析构函数,我是否需要虚拟析构函数?
- 4. 为什么用户定义的析构函数的插入需要一个用户定义的复制构造
- 5. 是否需要定义来自不同类的移动构造函数?
- 6. 我是否需要在析构函数中使用DeleteCriticalSection?
- 7. C++需要析构函数
- 8. 需要构造函数/析构函数/类型转换错误
- 9. 我是否需要删除析构函数中的基本数据类型? C++
- 10. OOP - 是否需要构造函数?
- 11. 在析构函数中是否需要删除?
- 12. VB6类是否具有析构函数?
- 13. AS3是否有类析构函数?
- 14. CoffeeScript是否有类析构函数?
- 15. 需要确保构造函数/析构函数被调用一次。但“错误:析构函数是私有的”
- 16. 在派生类中是否需要显式声明析构函数?
- 17. 如果子类不定义构造函数,是否调用父构造函数?
- 18. 是否需要在Javascript函数中定义参数?
- 19. 是具有指针结构的类所需的析构函数
- 20. 派生类是否总是需要调用默认的基础构造函数?
- 21. 是否需要调用std构造函数的调用?
- 22. 虚拟析构函数 - 有需要时
- 23. 为什么我需要定义自定义构造函数?
- 24. 是否有可能重新定义析构函数?
- 25. 对构造函数和析构函数的未定义引用
- 26. Esper用户定义的函数,需要两个参数
- 27. 当调用子类的析构函数时,父类的析构函数是否也会被调用?
- 28. 类中的方法(而不是构造函数)是否需要参数?
- 29. 是否需要在ANY调用例程中声明用户定义函数的类型?
- 30. 用户定义构造函数的非聚合类的值初始化
什么是非RAII类? – juanchopanza 2014-10-29 13:21:22
好的,说RAII我是指类的主要目标是获取和释放资源。非RAII类是一个有其他目标的类。 – 2014-10-29 13:25:59
不知道我明白..你能用这样的代码做一个这样的类的例子吗? – 2014-10-29 13:26:57