1. 宁可拿 non-member non-friend 函数替换 member 函数。这样做可以增加封装性、包裹弹性(packaging flexibility)和机能扩充性。(详情参考书中内容)
问题描述
假设类 WebBrowser 有3个函数:
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
...
};
当用户想一次性执行这3个函数时,有两种方式。
方式一是 WebBrowser 提供一个 member:
class WebBrowser {
public:
...
// 在下面函数种调用clearCache、clearHistory、removeCookies
void clearEverything();
...
}
方式二是通过 non-member 函数:
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
那么,member 和 non-member 哪种方式比较好呢?
答案:non-member 更好
-
从封装的角度
non-member 比 member 的封装性更好。对于对象内的数据,越多的代码(函数)能访问它,说明数据的封装性越低。条款22曾表明,成员变量应该是 private,如果不是,则有无限的函数能访问它们,毫无封装性。当你选择是使用 member 和 non-member、non-friend 中哪一个来访问 private 数据时,而且两者提供的功能相同,导致较大封装性的是 non-member 和 non-friend 函数。因为这样实现了功能的同时,没有增加能访问 private 变量的函数数量。
评论区