C++设计一个类不能偷懒的地方

上一篇 / 下一篇  2012-07-23 09:26:32 / 个人分类:C++

51Testing软件测试网3V8\^C5^

  1、构造函数/默认构造函数:关于怎样去初始化一个对象的问题,也就是一个新的数据类型怎样去填充它的内 容,需要考虑是否需要是explicit还是implicit强调,一般建议explicit来强调,因为存在隐式类型转换总是让人不太放心。需要考虑的 细节很多,有默认参数的值设计,数据成员初始化列表等等。。。实例化一个对象也就是运行了一次相应的构造函数,保证实例化之后的对象的数据成员的内容可控 总是好的。

s#ki7e'g s5{o7s0

4[)V!T)Y e@9@+|0 51Testing软件测试网4h*F#|-@-e8B4t

class A
E/H_Wm)~0b0{
,b;BEG K y8u0     A();
{;p'sx$F)?e a"[&m:b0     A(X _x, Y _y):x(_x),y(_y){ }
X;GHZ!qF5j0      //...51Testing软件测试网)v;i `2f'c1zk~$X`+E
private:51Testing软件测试网 N? o$O#Ub1]8Y
     X x;
jw%mC$X0     Y y;51Testing软件测试网"g%UAZ_,O+f
      //...
W2e4t9cEW0}#x4~0};

O"`b8Lzt0  2、拷贝构造函数/赋值函数:这里涉及到的思考是怎样准确复制一个对象的问题。尤其是在类当中有指针指向自 由空间的资源(堆空间)的时候,这个时候更加不能依赖于由编译器默认产生的拷贝构造函数/赋值函数,因为默认的情况是按对象的成员逐个复制的,往往会涉及 到析构函数多次析构同一资源,造成的结果是未定义的!又比如智能指针的所有权的转移的问题,甚至会出现了业务逻辑错乱的陷阱。

2]#QE#jz1_9O0 51Testing软件测试网v)^|`8t?zW

  一般形式是:51Testing软件测试网5H;pe:ns-T9\u

51Testing软件测试网1Y0|lX)dT"K y

`z#n9wh3tX0
class A51Testing软件测试网E}lmC
{
y`vJc(ZA0       A(const A& rhs);//拷贝构造函数51Testing软件测试网X!Z`+J/D!l1vI0S
       A & perator=(const A& rhs);//赋值函数51Testing软件测试网"n.f!} F1J$X.h
       //...51Testing软件测试网8[h+o4].MN
};

YnRcV,h3M H q0  这个时候,需要做的就是要头脑清醒,为这些复制操作定义自己认为最适合的任何意义。一般来讲,拷贝构造函数和赋值函数是不一样的,根本原因就 是。拷贝构造函数是去完成对未初始化的存储区的初始化,而赋值函数是去正确处理一个结构良好的对象。通常情况下,可以对赋值函数做一些优化,策略是:防止 自赋值,删除那些旧资源,复制新数据。通常每个非静态成员都必须复制。

)M4~3gECcmVe7EN0

A0dV*q d2?4t1R,K2~D0  3、析构函数:C++程序员第一要学会的事情就是要学会照顾好自己的程序!首先就是要管理好申请的资源,承 诺自己回收不再使用的资源,C++对象模型,或者管理自定义数据类型资源的一个关键的模型就是析构函数,编译器保证在对象的生命期结束的时候执行该对象的 析构函数(如果没有明确定义,那么就帮你生成一个),这是一个语言机制!

8q2h d7l\Y D4g/^0 51Testing软件测试网Z1g2K1Df

  要么乖乖按规则办事,要么自己负责后果。析构函数可以认为她是酒店打扫卫生的阿姨,当你在酒店房间里开完激情的party之后,你需要有人来帮 你清理这一切,对吧?否则退房之后不管不顾,那不情况一团糟吗?所以承诺你设计的一个良好的类,一定要有一个对应的释放资源的机制,关键之一是析构函数。

[B zX5G0 51Testing软件测试网*uAuFu$\ L

?3Vumb8O`Y,[0 class A
bykrA@O0{51Testing软件测试网'@{T |#k,Ty]i
     virtual ~A();
~G8VJ,@'Q:_(];j F/X0};

TAG:

 

评分:0

我来说两句

Open Toolbar