作者在这一节中花了大幅度的篇幅来介绍为什么最好使用non-member、non-friend函数。

思路如下:

场景:如果有一个class用来表示网页浏览器,那么清楚缓存及历史记录的时候,我们可能定义下面的类:

class Web {
public:
void clearCache();
void clearCookies();
void clearHistory();
}

但是也有可能用户需要一下子全部清除这些信息,于是我们再定义下面这个成员函数:

class Web {
public:
void clearEverything();
.....
}

当然,我们可以使用一个non-member函数来完成这个操作:

void clear (Web& wb) {
wb.clearCache();
wb.clearCookies();
wb.clearHistory();
}

根据面向对象守则要求,数据以及操作数组的那些函数应该被捆绑在一块。虽然这么说,但是针对clear操作而言,non-member函数clear()具有更大的封装性。

因此,我们推荐使用non-member函数。

而在实际操作中,在class拥有很多操作函数的时候,我们经常是将class成为一个non-member函数并且位于web所在的同一个namespace内。比如:

 // 头文件“web.h”
namespace Web{
class Web{};
.... // 放入核心机能,例如几乎客户需要的所有non-member函数 } // 头文件“webbrowser.h”
namespace Web{
class Web{};
.... // 与浏览器标签相关的函数 } // 头文件“webcookies.h”
namespace Web{
class Web{};
.... // 与Cookies相关的函数 }

上述正式C++标准程序库的组织方式。

◆总结

宁以non-member、non-friend替换member函数。这样做可以增加封装性、包裹弹性和机能扩充性。

[Effective C++ --023]宁以non-member、non-friend替换member函数的更多相关文章

  1. Effective C++ -----条款23:宁以non-member、non-friend替换member函数

    宁可拿non-member non-friend函数替换member函数.这样做可以增加封装性.包裹弹性(packaging flexibility)和机能扩充性.

  2. Effective C++:条款23:宁以non-member、non-friend替换member函数

    (一) 有个class来表示网页浏览器: class WebBrowser { public: void clearChache(); void clearHistory(); void remove ...

  3. 理解#define offsetof(struct_t,member) ((int)&((struct_t *)0)->member)

    #define offsetof(struct_t,member) ((int)&((struct_t *)0)->member) 这个东西很多人应该知道: offsetof是用来判断结 ...

  4. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)宏的运行机理:1. ( (TYPE *)0 ) 将零转型为TY ...

  5. 条款23:宁以non-member, non-friend,替换member函数。

    考虑下面这种经常出现的使用方式: class webBroswer{ public: ... void clearCache(); void clearHistory(); void removeCo ...

  6. 条款23:宁一 non-member no-friend 替换member函数(prefer non-member non-friend functions to members functions)

    NOTE : 1.宁可拿non-member non-friend 函数替换member函数.这样做可以增加封装性/包裹单性(packaging flexibility)和机能扩展性.

  7. #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

    #include <iostream> #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) usi ...

  8. 【23】宁以non-member、non-friend替换member函数

    1.non-member方法与member方法没有本质区别,对于编译器来说,都是non-member方法,因为member方法绑定的对象,会被编译器转化为non-member方法的第一个形参.non- ...

  9. 在反射中Member{get{..}set{..}}与Member{get;set;}的区别?

    最近的在写代码的时候,需要用到反射来获取类中的所有公开属性值,于是写下如下代码: StringBuilder sb = new StringBuilder(); foreach (var f in t ...

随机推荐

  1. insert /*+APPEND*/ 各种insert 插入速度比较

    SQL> select count(*) from t;COUNT(*)----------5442048****************************SQL> alter ta ...

  2. windows系统下的文件夹链接功能mklink/linkd

    vista及以上系统的mklink命令可以创建文件夹的链接(感觉像是文件夹的映射).因为是从底层实现文件夹链接,所以这个链接是对应用程序透明的. (windows 2000,xp,server 200 ...

  3. SQLSERVER2008 18456错误

    转自:http://www.cnblogs.com/496963524-zhangying/articles/2232599.html 百度搜18456错误几乎只能搜到一篇文章,并不是说结果条数,而是 ...

  4. (转载)memcpy的几个实现版本

    (转载)http://blog.sina.com.cn/s/blog_4d3a41f40100cvza.html 实现void *memcpy(void *to, const void *from, ...

  5. CF GYM 100703K Word order

    题意:给一个字符串,其中只有F.A.N三种字母,问最少交换多少次能使所有的A在所有F之前. 解法:贪心.先预处理每位的左边有多少F右边有多少A,对于每位A必须至少向左交换的次数为它左面的F个数,而对于 ...

  6. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  7. 5个经典的JavaScript面试基础问题

    JavaScript程序员在IT领域中的需求量非常巨大.如果你非常精通JavaScript,你会有很多换工作.涨薪水的机会.但是在一家公司录用你之前,你必须顺利通过面试,证明你的技能.在本文中,我将向 ...

  8. WebAPI 小知识

    1.HttpResponseMessage.ReasonPhrase可以返回原因说明短语, 用JQuery中的$.ajax调用,返回函数第三个参数可以获取,如下: success:function(d ...

  9. hdoj 2097 Sky数

    Sky数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. MFRCC522 SPI无法通讯【worldsing笔记】

    用单片机于MRFC522与单片接时,加上485通讯后出现很诡异的像: 只要485芯片上有收到外部发送的信号时RC522就死掉,经过仿真卡在了SPI的收发部分(等待回复) u8 MFRC522Write ...