C++编程惯用方法(2)

 

一. 避免进行重编译:(Cheshire Cat)

如果我们可以很好的隐藏类的实现那么对于实现的改动将不会导致已有代码的崩溃,不过它通常都会要求我们重新编译这些代码。

如:对内联函数定义的改动,对于对象大小的改动,以及对于使用内联函数访问的对象结构的改动都将导致程序的重新编译。我们
可以使用句柄来避免这些重编译:如果我们改动了rep 的实现,用户要做的只是重新连接(而不是编译)一下他们的程序。


下面是一个新版本的String类,在其中我们没有使用计数器,而是使用了句柄来减少编译时期的依赖关系:

//文件 String.h

class String_rep;

class String
{
private:
 String_rep* rep;
public:
 String(const char* = "");
 String(const String& );
 ~String();
 const String& operator=(const String& ); 
};


另外一个头文件是一个私有的头文件,我们不需要将它分发给用户。它里面包含了rep 类的完整声明:

//文件 String_priv.h

#include "String.h"

class String_rep
{
private:
 friend class String; 
 
 int use_count;
 char* chars;
 
 String_rep(const char* );
 String_rep(const String_rep& );
 ~String_rep();
 
 void increment();
 void decrement();
 const String_rep* operator=(const String_rep& );
};

用该私有头文件来编译String和String_rep的成员:

#include "String_priv.h"

String::String(const char* cp)
:rep(new String_rep(cp))
{
 rep->increment();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值