Effective C++读书笔记之宁以non-member、non-friend替换member函数

面对的问题:
 举个例子来看我们要面对的问题, 有一个class用来表示网页浏览器。
 class WebBrowser {
 pbulic:
  ....
  void clearCache();    //清除下载高速缓存区(cache of downloaded elements)
  void clearHistory();  //清除访问过的URLs的历史记录(history of visited URLs)
  void removeCookies(); //移除系统中的所有cookies
  ....
 };
 许多用户会想整个执行所有这些动作,因此需要提供一个函数。有两个方法实现
 1)提供一个member函数
 class WebBrowser {
 public:
  .....
  void clearEverything();
  .....
 };
 2)也可以使用一个non-member函数
 void clearBrowser(WebBrowser& wb)
 {
  wb.clearCache();
  wb.clearHistory();
  wb.removeCookies();
 }
 现在我们面临的问题就是:使用哪个函数好。
       从面向对象守则要求来看,使用第一种方案好,可是事实上使用non-member函数比较好。这个有三方面的考虑:
 1) 面向对象要求对class中的数据的封装性,因此有一个粗糙的量测:愈多的函数可访问它,数据的封装性就愈低。因此我们可以这样来看对于一个class来说,如果member函数和一个non-member non-friend函数有相同的机能,那么non-member non-friend函数有较大封装性。因为它并不增加对class中的私有成员变量的访问数量。
 2) 提供non-member函数可允许对WebBrower相关机能有较大的包裹性(packageing flexibility),导致较低的编译相依度。在C++中,常用的方法是让clearBrowser成为一个non-member函数并且位于WebBrowser所在的同一个namespace(命名空间)内。
 一个像WebBrowser这样的class类可能有大量的像clearBrowser这样的便利函数,它们可能属于不同的功能团。怎么整理这些函数呢?最好的办法就是根据它们属于不同的功能团编译成不同的头文件。用户可以根据他们编写程序功能的不同,选择不同的头文件#include,进行编译。这正是C++标准程序库的组织方式。
 3) 可增加WebBrowser的可延伸性。上面的组织方式带来的好处就是增加了类的可延伸性。当我们需要扩展程序库功能时,只需添加便利函数non-member non-friend到相应的头文件中就可。
 总结:
 宁可拿non-member non-friend函数替换member函数。这样做可以增加封装性、包裹性(packaging flecibility)和机能扩充性 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值