宁可拿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…
主要的理由还是封装.nonmember nonfreind function 不能访问类private 成员变量. 这个场景是有一个类提供了一些基本功能,比如 class WebBrowser { public: void clearCache(); void clearHistory(); void removeCookies(); }; 有时候我们需要执行上述三个函数.我们的做法是 void clearBrowser(WebBrowerser &wb) { wb.clearCache();…
宁non-member.non-friend顶替member性能 本节介绍笔者为什么时间来实现某些功能.择非成员函数而且是非友元函数.这样做总结一句话,就是最大限度的实现类的封装性. 封装意味着不可见. 愈多东西被封装.欲少人能够看到它,我们就有愈大的弹性去改变它.愈少代码能够看到数据(訪问数据),愈多数据可被封装,我们就更有自由来改变对象数据.愈多函数能够訪问它,数据的封装性就愈低. 我们知道在上一节声明private数据成员也是为了实现类的封装.可见封装对于一个健壮的类来说的重要性. 以上就…
1.non-member方法与member方法没有本质区别,对于编译器来说,都是non-member方法,因为member方法绑定的对象,会被编译器转化为non-member方法的第一个形参.non-member方法与member方法唯一的区别是:member方法封装性更差,因为它可以访问private成员. 2.根据面向对象的要求,数据与方法应该和对象捆绑在一起,这意味着应该使用member方法.其实,这个建议是错误的.为什么? 3.首先,non-member.non-friend方法提供更大…
绝对不要重新定义继承而来的non-virtual函数.…
为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用Boost提供的版本,那个class名为noncopyable.…
class GamePlayer{private: static const int NumTurns = 5; int scores[NumTurns]; ...}; 万一你的编译器(错误地)不允许“static整数型class常量“完成”in class初值设定“,可改用所谓的”the enumhack" 补偿做法.其理论基础是:“一个属于枚举类型(enumerated type)的数值可权充ints被使用”,于是GamePlayer可定义如下: class GamePlayer{priva…
换一种说法就是宁可以编译器替换预处理器 举例 #define ASPECT_RATIO 1.653 记号ASPECT_RATIO也许从未被编译器看见:也许在编译起开始处理源码前它就被预处理器移走了,于是它并没有进入符号表,当出现编译错误的时候会提示1.653,但是不会提示ASPECT_RATIO. 解决办法就是用一个常量替换宏(#define): const double AspectRatio = 1.653; 常量替换宏的两种特殊情况 1. 常量指针 常量定义通常被放在头文件内(以便被不同的…
class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForSale&); HomeForSale& operator = (const HomeForSale&);//只有申明,此函数很少被使用   };   //方法二,设计一个专门用来阻止copying动作的基类,然后让其他类继承这个类即可   class Uncopyable { prot…