作者在这一节中花了大幅度的篇幅来介绍为什么最好使用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. 【聚类算法】谱聚类(Spectral Clustering)

    目录: 1.问题描述 2.问题转化 3.划分准则 4.总结 1.问题描述 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图 ...

  2. Erlang入门(四)——错误处理和鲁棒性

    去了趟福州,事情没搞定,托给同学帮忙处理了,回家休息了两天就来上班了.回家这几天最大的收获是第四次重读<深入Java虚拟机>,以前不大明了的章节豁然开朗,有种开窍的感觉,水到渠成,看来技术 ...

  3. 静态Web开发 DOM

    四章 Dom 1节dom中的顶级对象 dom(文档对象模型)js最终是要操作html页面,让html变成DHtml,而操作Html页面就要用到DOMDOM可以吧Html页面模拟成一个对象,如果js只是 ...

  4. [转]javascript console 函数详解 js开发调试的利器

    javascript console 函数详解 js开发调试的利器   分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...

  5. 用slf4j+logback实现多功能日志解决方案 --- 转

    大家都知道,slf4j是原来log4j的作者写的一个新的日志组件,意思是简单日志门面接口,可以跟其他日志组件配合使用,常用的配合是slf4j+logback,无论从功能上还是从性能上都较之log4j有 ...

  6. [RQNOJ313]波浪数

    题目描述 波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数, ...

  7. Solaris10下Telnet、SSH、ftp使用root登录

    学习solaris过程中,使用SecureCRT.putty等工具用root账号登录,总是登录不上去,后来经老师解答和网上找答案,发现是 solaris默认是不可以远程使用root账号登录的,如果想开 ...

  8. window2008 64位系统没有office组件问题分析及解决

    服务器是windows server2008 64位系统, 我的系统需要用到Microsoft.Office.Interop.Excel组件 在上传Excel单据遇到错误:检索 COM 类工厂中 CL ...

  9. HDFS的shell操作

    bin/hadoop命令操作: namenode -format 格式化文件系统 fs(缩写:FileSystem) 运行一个文件系统的用户客户端 bin/hadoop fs常用命令操作: -ls h ...

  10. BroadcastReceiver学习笔记

    1.在代码中注册与在AndroiManifest.xml注册的区别 (a)在代码中注册可以控制注册与注销的时间.比如在onCreate-onDestory, onStart-onStop, onRes ...