如何定义一个完整的类

上一篇 / 下一篇  2012-10-12 15:14:39 / 个人分类:杂谈

'c6LQ}%o#l0  定义一个类时必须搞清楚的几个问题:

(z[(A+?#d]:h u pJ0 51Testing软件测试网t"b&bV`yX2F

  1、需要构造函数吗?51Testing软件测试网to5_m?f*d&BA

51Testing软件测试网1BF(G9S/UJj,i;k+F.Q:E

  如果答案为 no,那么很可能你需要定义的只是一个结构,而不是一个类,因为构造函数的用途是用一种明确定义的状态来设置对象。

j)WS'E)x@"y:v0

KF2a8zgV0  2、数据成员是私有的吗?

}{`9^dOk0

;~@'VZ$L,T:e7}0  一般来说,如果数据成员为公有,你很难控制这些成员何时被访问。

9C"e5e*pW b0

rh,U;kZR ^g6d0  3、需要一个无参数的构造函数吗?

I'H&ZWPJB%E0

ZK4c:LG7? R5Pd0  如果一个类已经有了构造函数,而你想声明该类的对象时不必显示地初始化它们,则必须显示地写一个无参数的构造函数。(特别是当你需要生成这个类的对象数组时!)51Testing软件测试网 LC/Tx5]+C

51Testing软件测试网(D a%C-}"p6U

  4、每个构造函数是否都对所有数据成员进行了初始化了?

MtO;j!Pw0

M4A8~wbctb0  对象的状态由对象的数据成员反映,因此每个构造函数都有负责为所有的数据成员设置经过明确定义的值。如果某个构造函数没有做到这一点,就很可能导致错误。(当然,这种说法未必总是正确的。因为有时,某些数据成员,只有在该对象存在了一定的时间后才有意义。)51Testing软件测试网9lp G+GMh`z+E$HK

/t[L1R-N t0  5、需要析构函数吗?

Csiw*|0

]'e?-~4W0  并不是所有的类都需要析构函数的。一般来说,如果一个类分配了资源,并且这些资源不会被成员函数自动释放,那么这个类就需要一个析构函数。

kmX$}2u0 51Testing软件测试网.j@N;? AI.B I

  6、需要一个虚析构函数吗?51Testing软件测试网N1gB&C LHzpHh

51Testing软件测试网+u"|Z6F5k5O

  任何不作为基类的类是不需要虚析构函数的,虚析构函数只有在继承的情况下才有用。当可能发生 delete 一个类型为基类的指针,可实际上该指针代表的是一个子类的对象,这个基类定义时需要一个虚析构函数。51Testing软件测试网5[ \6qvXK]#AA#[

51Testing软件测试网7QEb4r6I!r

  7、需要一个复制构造函数吗?

TbGO,n0O_2_O9|0

N[ ?;`@^:J0  如果用类缺省的复制构造函数复制该类的对象时,如果能完整复制该类的数据成员和基类对象,就不需要复制构造函数,否则就需要。特别是,如果你的 类在构造函数内分配了资源,或者在成员函数中分配了资源,则很可能需要一个显示的复制构造函数来管理资源。有析构函数(除了空的析构函数外)的类通常是用 析构函数来释放资源,这通常也说明需要一个复制构造函数。51Testing软件测试网*fp.m'l5Vkh,OG

51Testing软件测试网(t ]9_3U)CZ

  8、需要一个赋值操作符吗?

3Uv,M.u'fU)U+}0

i*p B(u1~H~0  如果你的类需要复制构造函数,多半也需要一个赋值操作符。当然,如果你不想用户设置类中的对象,可以将赋值操作符声明为私有的。

5g%nxWD.YxW/xEN0 51Testing软件测试网)TH'z:dkn-e6@5h

  9、赋值操作符能正确地将对象赋给对象本身吗?

3n tzk7n}cF)i0 51Testing软件测试网 `\Mg$^q4_0e$v

  自我赋值是常犯的错误!赋值总是用新值取代目标对象的旧值。如果原对象和目标对象是同一个,而我们又奉行“先释放旧值,再复制新值”的原则,那么就可能在还没有实施复制之前就把原对象销毁了!51Testing软件测试网 F6mWu9P+I

Lam;bSs.n0  10、需要定义关系操作符吗?

/d3L {6BlC#h|0 51Testing软件测试网-Kx#r7k9n'N bD

  如果你的类需要放入stl的容器中,很可能需要定义关系操作符。把一个新对象加入容器中,某些容器,需要把新对象与容器里已有的对象进行比较, 比如进行相等比较,进行大小比较。因此,如果类逻辑上支持相等操作,那么提供 perator== 和 operator!= 就会很有好处。类似,如果类的值有某种排序关系,你就可以提供 operator< 或者 operator> 等关系操作符。只要这些容器需要创建你的类的有序集合,你就必须提供关系操作符。51Testing软件测试网 owB9ecui

~ yw{kPV!A0  11、删除数组时记住用delete[]了吗?51Testing软件测试网!_yT.D G ~ \4m

F'E0lg G0  在删除任何类型的数组时使用delete[]是一种很好的习惯。51Testing软件测试网m6_erzX Bp6{

51Testing软件测试网:{JMe9X&f$d-Y

  12、在复制构造函数和赋值构造函数的参数类型中加上const了吗?

PF"|$F0~w*Zg0 51Testing软件测试网4S6D@S;{{6}D

  这是某些 C++ 著作中也会犯的错误!51Testing软件测试网2H;By*` p)lu

AvT?qL0  如果函数有引用参数,只有在函数想改变函数的输入参数时,才应该不用 const 声明该引用参数!通常这个会被改变的输入参数也肩负着输出参数的角色。

-y2x^q6D\ {O0 51Testing软件测试网 t,DBWUj

  13、记得适当地声明成员函数为const了吗?

ug&g[6m'tsV` VZ0 51Testing软件测试网g7Vq@2W MuCR%B

  如果确信一个成员函数不用修改它的对象,就可以声明它为 const。

4Z;G)B/x-ay)I!|lt0 51Testing软件测试网t(@*Q3|:i {:Jw _

  14、一个需要上述所有特性类定义的例子

S*w*I2D6p8h.M;l0 51Testing软件测试网ppi{]6q.F

d4Y?T;lN^0
 // 声明
4}+HgQ6H0 class A{51Testing软件测试网!je'y:z } ty/tkg#]p
public:51Testing软件测试网X5[8v2h a8}
A();51Testing软件测试网;R$jC{O8k
virtual ~A();51Testing软件测试网UR'K!e%] i1Q {
A(const A& s);51Testing软件测试网6U/AS5hxP&p5E;r
A& perator=(const A& s);51Testing软件测试网,z[1qC)m*o#Iv:OeTU
bool perator==(const A& s) const;
:g;` r~b;U0 bool operator!=(const A& s) const;
ralxA iV5aZ_0 bool operator<(const A& s) const;51Testing软件测试网+aY]%t7B [
};
(b'\4w/F c,Z2W#p]&mW0
4yx2Sn;}m/Wi+Q0 // 实现

/id)?0F/|8W!c#S^0 A::A(){
lbd vt+W@0 // todo...51Testing软件测试网*K#w%|@\8\
}51Testing软件测试网2w`+r#JZ
51Testing软件测试网u et:C:W&tv
A::~A(){
J_(m)HLB0 // todo...
ArOMn:S2P3eU0 }
a{.`{f9[.]G5~D!gy0
gR&?W] x4u*k@(I0 A::A(const A& s){
"HG/z^Y-V2h&V0 // todo...
4b#^*y%G am9JK0 }
&TZ ~#N6B#BBD0
Ua!dISB/K/n0 A& A::operator=(const A& s){51Testing软件测试网 V+U L:k"ep!Kc#l
if(&s != this){51Testing软件测试网 V-V#kf,r[
// todo...
$q[hSX{Wx%w9~0 }
?CRSL4u3?y0 return *this;
#T9?C6XG'V0 }
R0K+m,T gz0
ewLLF/K0 bool A::operator==(const A& s) const{51Testing软件测试网5q:B"?UVh8~f
// todo...51Testing软件测试网|)\~#Yf;`+s
return false;
!l0tvo/u&JP[.^0 }51Testing软件测试网,N P7DJ&VY3W0Y%A xX
51Testing软件测试网 ?hhVN/_ma
bool A::operator!=(const A& s) const{
I7_`-Eb i)c;C+P A0 return !((*this)==s);
#c{8e4_0Cf0 }51Testing软件测试网0i L;U3{HxV~ QB

qy7]0|R0 bool A::operator<(const A& s) const{51Testing软件测试网/X A-c3pG*w
// todo...51Testing软件测试网@u8g b/K.g/]p]{
return false;
1YdbI? e}g/s9g"I(h0 }

TAG:

 

评分:0

我来说两句

Open Toolbar