作者在这一节中花了大幅度的篇幅来介绍为什么最好使用non-member.non-friend函数. 思路如下: 场景:如果有一个class用来表示网页浏览器,那么清楚缓存及历史记录的时候,我们可能定义下面的类: class Web { public: void clearCache(); void clearCookies(); void clearHistory(); } 但是也有可能用户需要一下子全部清除这些信息,于是我们再定义下面这个成员函数: class Web {public: voi…
宁可拿non-member non-friend函数替换member函数.这样做可以增加封装性.包裹弹性(packaging flexibility)和机能扩充性.…
(一) 有个class来表示网页浏览器: class WebBrowser { public: void clearChache(); void clearHistory(); void removeCookies(); }; 很多用户会想一整个运行全部这些动作,因此WebBrowser也提供这样一个函数:clearEverything class WebBrowser { public: void clearChache(); void clearHistory(); void removeC…
#define offsetof(struct_t,member) ((int)&((struct_t *)0)->member) 这个东西很多人应该知道: offsetof是用来判断结构体中成员的偏移位置.他是一个宏定义. (struct_t *)0是一个指向struct_t类型的指针,其指针值为 0,所以其作用就是把从地址 0 开始的存储空间映射为一个 struct_t 类型的对象.((struct_t *)0)->member 是访问类型中的成员 member,相应地 &…
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)宏的运行机理:1. ( (TYPE *)0 ) 将零转型为TYPE类型指针; 2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址; 4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型.巧妙之处在于将0转 换成(TY…
考虑下面这种经常出现的使用方式: class webBroswer{ public: ... void clearCache(); void clearHistory(); void removeCookies(); ... }; 那么很自然的就会想到增加这么一种清理方式: class WebBrowser{ public: ... void clearEverything(); }; 或者是这么一种清理方式: void clearBrowser(WebBrowser & wb) { wb.cl…
NOTE : 1.宁可拿non-member non-friend 函数替换member函数.这样做可以增加封装性/包裹单性(packaging flexibility)和机能扩展性.…
#include <iostream> #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) using namespace std; int main(){ struct Demo{ char sex; int id; }; cout << "IOFFSETOF(Demo, sex): " << IOFFSETOF(Demo, sex) << end…
1.non-member方法与member方法没有本质区别,对于编译器来说,都是non-member方法,因为member方法绑定的对象,会被编译器转化为non-member方法的第一个形参.non-member方法与member方法唯一的区别是:member方法封装性更差,因为它可以访问private成员. 2.根据面向对象的要求,数据与方法应该和对象捆绑在一起,这意味着应该使用member方法.其实,这个建议是错误的.为什么? 3.首先,non-member.non-friend方法提供更大…
最近的在写代码的时候,需要用到反射来获取类中的所有公开属性值,于是写下如下代码: StringBuilder sb = new StringBuilder(); foreach (var f in this.GetType().GetFields()) { sb.AppendLine(string.Format( "{0}={1};", f.Name, f.GetValue(this))); } return sb.ToString(); 工作正常,后又在另一处对另外一个类需要获取属性…