要点:优先考虑非成员非友元函数。
通过Browser类的clearBrowser函数,Meyers指出面向对象原则建议成员函数更好是不正确的。理由如下:
- 面向对象原则要求数据尽可能地封装
- 对成员变量而言,能访问它的代码越少,封装性更好,也更容易修改
- 从粗颗粒度的度量,封装性与可访数据的函数(成员函数、友元函数)个数成反比
因此,使用非成员非友元函数封装性更好。从封装性角度考虑,不是选择成员和非成员函数,而是选择成员和非成员非友元函数。成员和非成员的另一个考虑因素是隐式类型转换,参见条款24。
另一个需要说明的是,一个函数不是某类的成员函数并不意味着它不可以是另一个类的成员函数,例如clearBrowser可以是BrowserUtility类的成员函数。如果有许多个类似clearBrowser的便捷函数(convenience functions),可将他们分类放入不同的头文件中,客户代码仅需include使用到的头文件。
如果需要扩展功能,仅需增加新的头文件,而不影响已有代码。这与类也不同,扩展类接口会影响现有代码。
总之,采用非成员非友元函数有以下好处:
1) 更好的封装性
2) 更灵活的打包(packaging)
3) 更容易扩展功能。