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