考虑下面这种经常出现的使用方式:
class webBroswer{ public: ... void clearCache(); void clearHistory(); void removeCookies(); ... };
那么很自然的就会想到增加这么一种清理方式:
class WebBrowser{ public: ... void clearEverything(); };
或者是这么一种清理方式:
void clearBrowser(WebBrowser & wb) { wb.clearCache(); wb.clearHistory(); wb.clearCookie(); }
如果要在功能相同的一个member function和一个non-member, non-friend function之间选的话,那么具有较高的封装性的是non-member, non-friend function.
(注意这里的在意封装性,让一个function成为一个class的non-member),不影响其成为另一个class的member函数,例如上面的clearBrowser函数来说,其完全可以作为某个工具类的static member函数)
一般的好的做法是让,clearBrowser放置在与clss WebBrowser相同的一个namespace里面。像下面这样:
namespace WebBrowserStuff{ class WebBrowser{...}; void clearBrowser(WebBrowser & wb);//类似clearBrowser这类的便利函数可以在一个namespace里面声明多个。 };
而且由于namespace可以跨头文件存在,这样也方便这类的工具函数进行跨头文件的维护。
小结:
记住应该用non-member non-friend函数替换member函数,这样做可以增加封装性,包裹弹性以及机能扩充性质。
时间: 2024-10-22 15:36:54