`
810364804
  • 浏览: 785235 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多


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

class A

{

A();

A(X _x, Y _y):x(_x),y(_y){ }

//...

private:

X x;

Y y;

//...

};



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

一般形式是:

class A

{

A(const A& rhs);//拷贝构造函数

A & operator=(const A& rhs);//赋值函数

//...

};


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


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

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

class A

{

virtual ~A();

};



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics