关闭

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

发表于:2012-7-20 09:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:temotemo    来源:51Testing软件测试网采编

  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();
};

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号