[Effective C++ --023]宁以non-member、non-friend替换member函数
作者在这一节中花了大幅度的篇幅来介绍为什么最好使用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函数的更多相关文章
- Effective C++ -----条款23:宁以non-member、non-friend替换member函数
宁可拿non-member non-friend函数替换member函数.这样做可以增加封装性.包裹弹性(packaging flexibility)和机能扩充性.
- Effective C++:条款23:宁以non-member、non-friend替换member函数
(一) 有个class来表示网页浏览器: class WebBrowser { public: void clearChache(); void clearHistory(); void remove ...
- 理解#define offsetof(struct_t,member) ((int)&((struct_t *)0)->member)
#define offsetof(struct_t,member) ((int)&((struct_t *)0)->member) 这个东西很多人应该知道: offsetof是用来判断结 ...
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)宏的运行机理:1. ( (TYPE *)0 ) 将零转型为TY ...
- 条款23:宁以non-member, non-friend,替换member函数。
考虑下面这种经常出现的使用方式: class webBroswer{ public: ... void clearCache(); void clearHistory(); void removeCo ...
- 条款23:宁一 non-member no-friend 替换member函数(prefer non-member non-friend functions to members functions)
NOTE : 1.宁可拿non-member non-friend 函数替换member函数.这样做可以增加封装性/包裹单性(packaging flexibility)和机能扩展性.
- #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#include <iostream> #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) usi ...
- 【23】宁以non-member、non-friend替换member函数
1.non-member方法与member方法没有本质区别,对于编译器来说,都是non-member方法,因为member方法绑定的对象,会被编译器转化为non-member方法的第一个形参.non- ...
- 在反射中Member{get{..}set{..}}与Member{get;set;}的区别?
最近的在写代码的时候,需要用到反射来获取类中的所有公开属性值,于是写下如下代码: StringBuilder sb = new StringBuilder(); foreach (var f in t ...
随机推荐
- c# equals与==的区别
对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true.对于 string ...
- apache开源项目--Shiro
安全是企业应用中不可缺少的功能,在众多权限框架中,Shiro(其前身是JSecurity)因其简单而又不失强大的特点引起了不少开发者的注 意.随着Grails的关注度越来越高,在Grails社区也出现 ...
- [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件
页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...
- Gen_server行为分析与实践
1.简介 Gen_server实现了通用服务器client_server原理,几个不同的客户端去分享服务端管理的资源(如图),gen_server提供标准的接口函数和包含追踪功能以及错误报告来实现通用 ...
- TPL
namespace TPLTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } pr ...
- IE兼容性问题解决方案2--css样式兼容标签
在页面中加入下面的标签: <meta http-equiv = "x-UA-compatible" content="IE=edge,chrome=1"& ...
- 笔记:1.css样式,最前边加 @charset "utf-8";是为什么2.js判断各种浏览器的方法
表明CSS文件的页面编码为UTF-8..如果这个CSS的文件编码也是UTF-8的话..那么在浏览器中看到的CSS文件的页面中中文的注释或者中文字体就可以正确显示为中文,如果CSS的文件编码和页面不一致 ...
- Hive基础介绍
HIVE结构 Hive 是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据的机 ...
- leetcode@ [87] Scramble String (Dynamic Programming)
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- HDU-4691 Front compression 后缀数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4691 后缀数组模板题,求出Height数组后,对Height做RMQ,然后直接统计就可以了... // ...