如何定义一个完整的类
上一篇 / 下一篇 2012-10-12 15:14:39 / 个人分类:杂谈
9Jkd~dP$m%Y0 定义一个类时必须搞清楚的几个问题:51Testing软件测试网n"[F9cvxM.Ka j}
51Testing软件测试网*C+PJ)^tC1、需要构造函数吗?51Testing软件测试网J;EY/R:b
51Testing软件测试网:sX+Q)Z[1zl/D#e如果答案为 no,那么很可能你需要定义的只是一个结构,而不是一个类,因为构造函数的用途是用一种明确定义的状态来设置对象。51Testing软件测试网B#Z XA4BLva
Q/WO(Zc5[l0 2、数据成员是私有的吗?51Testing软件测试网1`!_Th4U,y3?;g^[V
51Testing软件测试网kL |F!~一般来说,如果数据成员为公有,你很难控制这些成员何时被访问。51Testing软件测试网0D$K0VV lE3S"w,St
*Ek9n.uV0 3、需要一个无参数的构造函数吗?51Testing软件测试网l?i\ed Or2|
51Testing软件测试网`8D`/V{)|3A9[i/g如果一个类已经有了构造函数,而你想声明该类的对象时不必显示地初始化它们,则必须显示地写一个无参数的构造函数。(特别是当你需要生成这个类的对象数组时!)51Testing软件测试网nPZ4ss@$s5z"J
U ~2B+H Iuz0m0 4、每个构造函数是否都对所有数据成员进行了初始化了?
.X(E,yS[tp3|0pI P.?*p5A Ib#Hb0 对象的状态由对象的数据成员反映,因此每个构造函数都有负责为所有的数据成员设置经过明确定义的值。如果某个构造函数没有做到这一点,就很可能导致错误。(当然,这种说法未必总是正确的。因为有时,某些数据成员,只有在该对象存在了一定的时间后才有意义。)51Testing软件测试网V7QZj.W@}|+A*D$D
f7j5S)Uxk1p0 5、需要析构函数吗?
"Tg)L9_/p0 51Testing软件测试网}5k6X-Fh9]s\0A并不是所有的类都需要析构函数的。一般来说,如果一个类分配了资源,并且这些资源不会被成员函数自动释放,那么这个类就需要一个析构函数。
(cvd2owS2H0 51Testing软件测试网PA2t8o(?{P6、需要一个虚析构函数吗?
:]P Ob1@"H/Vo\0F%|XN&rR0 任何不作为基类的类是不需要虚析构函数的,虚析构函数只有在继承的情况下才有用。当可能发生 delete 一个类型为基类的指针,可实际上该指针代表的是一个子类的对象,这个基类定义时需要一个虚析构函数。51Testing软件测试网9C L7TkHv{dA
T2G*Xh'xR~Fi K8?WS-e0 7、需要一个复制构造函数吗?
q+ZR6ydi,x0 51Testing软件测试网&`%]Q5z UE m如果用类缺省的复制构造函数复制该类的对象时,如果能完整复制该类的数据成员和基类对象,就不需要复制构造函数,否则就需要。特别是,如果你的 类在构造函数内分配了资源,或者在成员函数中分配了资源,则很可能需要一个显示的复制构造函数来管理资源。有析构函数(除了空的析构函数外)的类通常是用 析构函数来释放资源,这通常也说明需要一个复制构造函数。
m\Zs1x%s0xB3[)vb|0 8、需要一个赋值操作符吗?51Testing软件测试网(eE%^aVbq;Sq-f}
51Testing软件测试网wS0f Y(d4S-i如果你的类需要复制构造函数,多半也需要一个赋值操作符。当然,如果你不想用户设置类中的对象,可以将赋值操作符声明为私有的。51Testing软件测试网-v/q:Sg+l} KG v
51Testing软件测试网C+_7Ee#~9q fWk?._:B9、赋值操作符能正确地将对象赋给对象本身吗?
KgOw,c0 51Testing软件测试网 x8t { G"@5C自我赋值是常犯的错误!赋值总是用新值取代目标对象的旧值。如果原对象和目标对象是同一个,而我们又奉行“先释放旧值,再复制新值”的原则,那么就可能在还没有实施复制之前就把原对象销毁了!
([yA7RZq*QT*z06R4rE,obu%\.q0 10、需要定义关系操作符吗?
\ fGEq0VT5n0z(A}:QlM0 如果你的类需要放入stl的容器中,很可能需要定义关系操作符。把一个新对象加入容器中,某些容器,需要把新对象与容器里已有的对象进行比较, 比如进行相等比较,进行大小比较。因此,如果类逻辑上支持相等操作,那么提供 perator== 和 operator!= 就会很有好处。类似,如果类的值有某种排序关系,你就可以提供 operator< 或者 operator> 等关系操作符。只要这些容器需要创建你的类的有序集合,你就必须提供关系操作符。51Testing软件测试网j9k#rWO cZ
51Testing软件测试网R.{$r:Ik;R%Gevp4a11、删除数组时记住用delete[]了吗?
:I[M.Cn-LD0,mP,I:e%X8y(oC-S0 在删除任何类型的数组时使用delete[]是一种很好的习惯。
}%c)TH-o0 51Testing软件测试网 L1b#K _Py,o EXak12、在复制构造函数和赋值构造函数的参数类型中加上const了吗?51Testing软件测试网8UM ZAtS
)]#pd,mE0 这是某些 C++ 著作中也会犯的错误!
O9z?D#g4Y&?n+P0 51Testing软件测试网A;sN+a#l如果函数有引用参数,只有在函数想改变函数的输入参数时,才应该不用 const 声明该引用参数!通常这个会被改变的输入参数也肩负着输出参数的角色。51Testing软件测试网R2fmG? a
,w0i"eH'lp-F0 13、记得适当地声明成员函数为const了吗?51Testing软件测试网%Zq'J5Gt2H6f y
f-\t6o$Arh0 如果确信一个成员函数不用修改它的对象,就可以声明它为 const。
m^m[/]0i0 51Testing软件测试网"O&g3g-~{vQ14、一个需要上述所有特性类定义的例子51Testing软件测试网{GrRC7h8]"s
51Testing软件测试网;@g5_,l Wnz51Testing软件测试网:H"b6x9jl6c
// 声明 51Testing软件测试网uXrFw&vJ class A{ {]o*Qyj9^0 public:51Testing软件测试网6c7{.?ds4BU?W A(); 2yp-]/H\)f\TX0 virtual ~A();51Testing软件测试网 VC$G0{J A(const A& s); |