條款23 寧願以非成員,非友元替換成員函式

2021-10-10 06:30:45 字數 1640 閱讀 8283

class webbrowser

public:

void clearcache();

void clearhistory();

void removecookies();

如果想執行類裡面所有的動作,有點使用者可能會提供這樣的乙個函式

class webbrowser

public :

void cleareverything();          //呼叫clearcache,clearhistory,和removecookies

當然,這一操作也可以由乙個非成員函式呼叫適當的成員函式而提供出來:

void clearbrowser( webbrowser& wb)

wb,clearcache();

wb.clearhistory();

wb.removecookies();

那麼哪乙個比較好呢,是成員函式,還是非成員函式呢?

讓我們從封裝開始討論,如果某些東西被封裝,它就不可再見。愈多東西被封裝,愈少人看到它,而愈少人看到它,我們就有愈大的彈性去改變它,因為我們改變的只是直接影響看到改變的那些人事物。因此愈多東西被封裝,我們改變那些東西的能力就愈大。這就是我們首先推崇封裝的原因:它使我們改變事物而只影響有限客戶。

對資料而言,愈多的資料可被封裝,而我們也就愈能地自由地改變物件資料。不讓訪問,愈多的函式可以訪問它,資料的封裝性就愈低。

所以導致較大的封裝性的是非成員函式和非友元函式,因為它並不增加「能夠訪問class內的private成員「這就解析了為什麼。

namespace webbrowserstuff

class webbrowserstuff;

void clearbrowser( webbrowser& wb);

然而這並不是為了好看而已,要知道,命名空間和類不同,前者可以跨越多個原始碼檔案而後者不能。這很重要。

如果clearbrowser不存在,類物件只能自行呼叫clearcache,clearhistory和removecookies.

但是通常大多數客戶只對其中某些含興趣。

//標頭檔案「webbrowser.h"

namespace webbrowserstuff

class webbrowser;

...                        //核心機能,例如幾乎所有客戶需要的非成員函式。

//標頭檔案「webbrowserbookmarks.h"

namespace webbrowserstuff

...              //與書籤相關的便利函式

//標頭檔案」 webbrowsercookies.h"

namesapce webbrowserstuff

...                       //與cookie相關的便利函式

將所有便利函式放在多個標頭檔案內當隸屬同乙個命名空間,意味著客戶可以輕鬆擴張這一組便利函式,他們需要做的是就是新增更多的非成員函式和非友元函式到此命名空間。這是class無法提供的另乙個性質,因為class定義無法對客戶不能擴充套件的。

Effective STL學習筆記 條款23

直接進入主題,為什麼會考慮使用vector代替關聯容器呢,可能有這樣的場景,一對關聯的資料,而時使用時要求資料查詢速度很快。當然我們必須知道有序的vector的缺點就是他必須保持有序,乙個新item插入可能造成其他元素的移動。所以這種場景可能在幾乎不插入和刪除時考慮。乙個例子 using pair ...

Effective C 條款23 第4章

prefer non member non friend functions to member functions 想象有個 class 用來表示網頁瀏覽器,這樣的 class 可能提供眾多函式,如下所示 class webbrowser 許多使用者會想一整個執行所有這些動作,因此webbrows...

條款46 寧願編譯和連線時出錯,也不要執行時出錯

1,先看乙個例子 class month static const month feb static const month dec int asint const for convenience,make it possible to convert a month to an int priva...