去同学那玩,看到这么一本书《C++沉思录》。这本书很早听过,但是没有读过。于是捧起书读了几章,感觉很是不错。其中第四章就是讲“类设计者的核查表”。虽然用c++有几年,但是有一些东西还是需要铭记于心的。
类设计者的核查表
一、
您的类需要一个构造函数么?
有些类太简单,无需构造函数,但有些类太复杂,他们需要构造函数来隐藏它们的内部工作方式。
二、
您的数据成员是私有的么?
通常使用公有的数据成员不是什么好事,因为类设计者无法控制何时访问这些成员。
三、
您的类需要一个无参的构造函数么?
如果一个类已经有了构造函数,想声明该类的对象可以不必显示地初始化它们,则必须显示地写一个无参的构造函数。
四、
是不是每一个构造函数初始化所有的数据成员?
构造函数的用途就是用一种明确定义的状态来设置对象。对象的状态由对象的数据成员进行反映。每个构造函数都要负责为所有的数据成员设置经过明确定义的值。
有时这种说法也未必总是正确的。有时,类会有一些数据成员,它们只在它们的对象存在了一定时间之后才有意义。提这个问题,只是激励你进行思考。
五、
类需要构造函数么?
不是所有有构造函数的类都需要构造函数。如果深入考虑一个类要做些什么,那么该类是否需要析构函数的问题就十分明显了。应该问一问该类是否分配了资源,而这些资源又不会有成员函数自动释放,这就足够了。特别是那些构造函数里包含了new表达式的类,通常要在析构函数中加上相应的delete表达式,所以需要一个虚析构函数。
六、
类需要一个虚析构函数么?
有些类需要虚析构函数只是为了声明他们的析构函数是虚的。当然,决不会用做基类的类是不需要虚析构函数的:任何虚函数只在继承的情况下才有用。
虚析构函数通常是空的。
七、
你的类需要复制构造函数么?
很多时候答案都是“不”,但是有时候答案是“是”。关键在于复制该类对象是否就相当于复制其数据成员和基类对象。如果并不相当,就需要复制构造函数。
如果你的类在构造函数内分配资源,则可能需要一个显示的复制构造函数来管理资源。有析构函数的类通常是析构函数来释放构造函数分配的资源,这通常说明需要一个复制构造函数。(空的虚析构函数除外)
如果不想用户能够复制该类的对象,就声明复制构造函数为私有的。如果其他的成员不会使用这些成员函数,声明就足够了,没有必要定义它们。
八、
你的类需要一个赋值操作么?
如果需要复制构造函数,同理多半也会需要一个赋值操作。
九、
你的赋值操作符能正确地将对象赋给对象本身么?
赋值总是用新值取代目标对象的旧值。如果原对象和目标对象是同一个,而我们又奉行“先释放旧值,再复制”的行事规程,那么就可能在还没有实施复制之前就把原对象销毁了。
十、
你的类需要定义关系操作符么?
如果你的类逻辑上支持相等操作,那么提供operate== 和operate!=可能会有好处。类似的,如果你的类的值有某种排序关系,那就可能会想提供余下的关系操作符。只要它们想创建你的类型的有序集合,你就必须提供关系操作符。
十一 删除数组时你记住了用delete[]么?
这个形式的存在,是C++希望在保持与C的兼容性的同时关注效率。C++要求用户告知要被删除的是不是数组。如果是,该实现就可能会提供另一个地方来存储长度,因为与数组所需的内存量相比,这个常数的开销会小很多。
十二
记得在复制构造函数和赋值操作符的参数类型中加上了const么?
复制构造函数应该是像X::X(const X&)这样,毕竟复制对象不会改变原对象。实际上,由于绑定一个非const引用到一个临时对象是非法的,使用X::X(X&)作为复制构造函数不会允许复制任何特殊表达式的结果。同样道理适用于赋值。
十三 如果函数有引用参数,它们应该是const引用么?
只有当函数想改变参数时,它才应该有不用const声明的引用参数。
其中很多作者提到,提这些问题并不是希望去寻求答案,只是希望能够激励你进行思考。所以当我们设计一个类的时候,多思考一下,有没有什么地方需要注意的,我们设计的类将会更合理,更健壮一些。
posted on 2009-07-25 08:32
Sandy 阅读(275)
评论(0) 编辑 收藏 引用 所属分类:
c++学习