面对的问题:
举个例子来看我们要面对的问题, 有一个class用来表示网页浏览器。
class WebBrowser {
pbulic:
....
void clearCache(); //清除下载高速缓存区(cache of downloaded elements)
void clearHistory(); //清除访问过的URLs的历史记录(history of visited URLs)
void removeCookies(); //移除系统中的所有cookies
....
};
许多用户会想整个执行所有这些动作,因此需要提供一个函数。有两个方法实现
1)提供一个member函数
class WebBrowser {
public:
.....
void clearEverything();
.....
};
2)也可以使用一个non-member函数
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
现在我们面临的问题就是:使用哪个函数好。
从面向对象守则要求来看,使用第一种方案好,可是事实上使用non-member函数比较好。这个有三方面的考虑:
1) 面向对象要求对class中的数据的封装性,因此有一个粗糙的量测:愈多的函数可访问它,数据的封装性就愈低。因此我们可以这样来看对于一个class来说,如果member函数和一个non-member non-friend函数有相同的机能,那么non-member non-friend函数有较大封装性。因为它并不增加对class中的私有成员变量的访问数量。
2) 提供non-member函数可允许对WebBrower相关机能有较大的包裹性(packageing flexibility),导致较低的编译相依度。在C++中,常用的方法是让clearBrowser成为一个non-member函数并且位于WebBrowser所在的同一个namespace(命名空间)内。
一个像WebBrowser这样的class类可能有大量的像clearBrowser这样的便利函数,它们可能属于不同的功能团。怎么整理这些函数呢?最好的办法就是根据它们属于不同的功能团编译成不同的头文件。用户可以根据他们编写程序功能的不同,选择不同的头文件#include,进行编译。这正是C++标准程序库的组织方式。
3) 可增加WebBrowser的可延伸性。上面的组织方式带来的好处就是增加了类的可延伸性。当我们需要扩展程序库功能时,只需添加便利函数non-member non-friend到相应的头文件中就可。
总结:
宁可拿non-member non-friend函数替换member函数。这样做可以增加封装性、包裹性(packaging flecibility)和机能扩充性
Effective C++读书笔记之宁以non-member、non-friend替换member函数
最新推荐文章于 2025-03-26 19:29:18 发布