Item23:宁以non-member,non-friend替换member函数

芝士wa
2024.4.7


引例,想象有个class用来表示网页浏览器。这样的class可能提供的众多函数中,有一些用来清除的函数,

class WebBrower{
public:
  ...
  void clearCache();
  void clearHistory();
  void removeCookies();
  void clearEverything();
  ...
};

void WebBrower::clearEverything(){
  clearCache();
  clearHistory();
  removeCookies();
}

clearEverything函数也可以作为非成员函数实现,

void clearEverything(WebBrower &b)
{
  wb.clearCache();
  wb.clearHistory();
  wb.removeCookies();
}

第二种实现方式,即非成员函数更好!

Why?

从封装的角度考虑,成员函数不仅可以访问对应的private数据,还可以访问其他private数据,enums,typedefs等等,而非成员函数无法访问这些,因此非成员函数提供了更大的封装性!


这里的非成员函数也可以是其他类的成员函数。
在C++中,更自然的做法是让clearEverything成为一个非成员函数并且位于WebBrower类所在的同一个namespace内:

namespace  WebBrowerStuff{
  class WebBrowerStuff{};
  void  clearBrowser(WebBrower &b);
}

宁可用non-member,non-friend函数替换member函数,这样做可以增加封装性、包裹弹性和机能扩充性。

posted @ 2024-04-07 16:54  芝士wa  阅读(25)  评论(0)    收藏  举报