10.2.4 如何处理C++(www.cppentry.com)中的类
注意,除了关于异常(Exception)的部分,大部分其他原则对C#也适用。
1.类
(1)使用类来封装面向对象的概念和多态(Polymorphism)。
(2)避免传递类型实体的值,应该用指针传递。换句话说,对于简单的数据类型,没有必要用类来实现。
(3)对于有显式的构造和析构函数,不要建立全局的实体,因为你不知道它们在何时创建和消除。
(4)只有在必要的时候,才使用“类”。
2.Class vs. Struct
如果只是数据的封装,用Struct即可。
3.公共/保护/私有成员Public、Private和Protected
按照这样的次序来说明类中的成员:public、protected、private
4.数据成员
(1)数据类型的成员用m_name说明。
(2)不要使用公共的数据成员,要用 inline 访问函数,这样可同时兼顾封装和效率。
5.虚函数Virtual Functions
(1)使用虚函数来实现多态(Polymorphism)。
(2)只有在非常必要的时候,才使用虚函数。
(3)如果一个类型要实现多态,在基类(Base Class)中的析构函数应该是虚函数。
6.构造函数Constructors
(1)不要在构造函数中做复杂的操作,简单初始化所有数据成员即可。
(2)构造函数不应该返回错误(事实上也无法返回)。把可能出错的操作放到HrInit()或FInit()中。
下面是一个例子(见代码清单10-3):
代码清单10-3
7.析构函数
(1)把所有的清理工作都放在析构函数中。如果有些资源在析构函数之前就释放了,记住要重置这些成员为0或NULL。
(2)析构函数也不应该出错。
8.New和Delete
(1)如果可能,实现自己的 New/Delete,这样可以方便地加上自己的跟踪和管理机制。自己的 New/Delete 可以包装系统提供的New/Delete。
(2)检查New的返回值。New不一定都成功。
(3)释放指针时不用检查NULL。
9.运算符(Operators)
(1)在理想状态下,我们定义的类不需要自定义操作符。只有当操作符的确需要时。
(2)运算符不要做标准语义之外的任何动作。例如,“==”的判断不能改变被比较实体的状态。
(3)运算符的实现必须非常有效率,如果有复杂的操作,应定义一个单独的函数。
(4)当你拿不定主意的时候,用成员函数,不要用运算符。
10.异常(Exceptions)
(1)异常是在“异乎寻常”的情况下出现的,它的设置和处理都要花费“异乎寻常”的开销,所以不要用异常作为逻辑控制来处理程序的主要流程。
(2)了解异常及处理异常的花销,在 C++(www.cppentry.com)语言中,这是不可忽视的开销。
(3)当使用异常时,要注意在什么地方清理数据。
(4)异常不能跨过 DLL 或进程的边界来传递信息,所以异常不是万能的。
11.类型继承(Class Inheritance)
(1)当有必要的时候,才使用类型继承。
(2)用Const标注只读的参数(参数指向的数据是只读的,而不是参数本身)。
(3)用Const标注不改变数据的函数。
【责任编辑:
云霞 TEL:(010)68476606】