亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++箴言:用非成員非友元函數取代成員函數

2019-11-17 05:29:12
字體:
來源:轉載
供稿:網友

  想象一個象征 web 瀏覽器的類。在大量的函數中,這樣一個類也許會提供清空已下載成分的緩存。清空已訪問 URLs 的歷史,以及從系統移除所有 cookies 的功能:

class WebBrowser {
 public:
  ...
  void clearCache();
  void clearHistory();
  void removeCookies();
  ...
};
  很多用戶希望能一起執行全部這些動作,所以 WebBrowser 可能也會提供一個函數去這樣做:

class WebBrowser {
 public:
  ...
  void clearEverything(); // calls clearCache, clearHistory,
  // and removeCookies
  ...
};
  當然,這個功能也能通過非成員函數調用適當的成員函數來提供:

void clearBrowser(WebBrowser& wb)
{
 wb.clearCache();
 wb.clearHistory();
 wb.removeCookies();
}
  那么哪個更好呢,成員函數 clearEverything 還是非成員函數 clearBrowser?

  面性對象原則指出:數據和對它們進行操作的函數應該被綁定到一起,而且建議成員函數是更好的選擇。不幸的是,這個建議是不正確的。它產生于對面向對象是什么的一個誤解。面向對象原則指出數據應該盡可能被封裝。與直覺不同,成員函數 clearEverything 居然會造成比非成員函數 clearBrowser 更差的封裝性。此外,提供非成員函數答應 WebBrowser 相關功能的更大的包裝彈性,而且,可以獲得更少的編譯依靠和 WebBrowser 擴展性的增進。因而,在很多方面非成員方法比一個成員函數更好。理解它的原因是非常重要的。

  我們將從封裝開始。假如某物被封裝,它被從視線中隱藏。越多的東西被封裝,就越少有東西能看見它。越少有東西能看見它,我們改變它的彈性就越大,因為我們的改變僅僅直接影響那些能看見我們變了什么的東西。某物的封裝性越強,那么我們改變它的能力就越強。這就是將封裝的價值評價為第一的原因:它為我們提供一種改變事情的彈性,而僅僅影響有限的客戶。

  結合一個對象考慮數據。越少有代碼能看到數據(也就是說,訪問它),數據封裝性就越強,我們改變對象的數據的特性的自由也就越大,比如,數據成員的數量,它們的類型,等等。作為多少代碼能看到一塊數據的粗糙的尺度,我們可以計數能訪問那塊數據的函數的數量:越多函數能訪問它,數據的封裝性就越弱。

  數據成員應該是 PRivate 的,因為假如它們不是,就有無限量的函數能訪問它們。它們根本就沒有封裝。對于 private 數據成員,能訪問他們的函數的數量就是類的成員函數的數量加上友元函數的數量,因為只有成員和友元能訪問 private 成員。假設在一個成員函數(能訪問的不只是一個類的 private 數據,還有 private 函數,枚舉,typedefs,等等)和一個提供同樣功能的非成員非友元函數(不能訪問上述那些東西)之間有一個選擇,能獲得更強封裝性的選擇是非成員非友元函數,因為它不會增加能訪問類的 private 部分的函數的數量。這就解釋了為什么 clearBrowser(非成員非友元函數)比 clearEverything(成員函數)更可?。核転?WebBrowser 獲得更強的封裝性。

  在這一點,有兩件事值得注重。首先,這個論證只適用于非成員非友元函數。友元能像成員函數一樣訪問一個類的 private 成員,因此同樣影響封裝。從封裝的觀點看,選擇不是在成員和非成員函數之間,而是在成員函數和非成員非友元函數之間。(當然,封裝并不是僅有的觀點,假如觀點來自隱式類型轉換,選擇就是在成員和非成員函數之間。)

  需要注重的第二件事是,假如僅僅是為了關注封裝,則可以指出,一個函數是一個類的非成員并不意味著它不可以是另一個類的成員。這對于習慣了所有函數必須屬于類的語言(例如,Eiffel,java,C#,等等)的程序員是一個適度的安慰。例如,我們可以使 clearBrowser 成為一個 utility 類的 static 成員函數。只要它不是 WebBrowser 的一部分(或友元),它就不會影響 WebBrowser 的 private 成員的封裝。

  在 C++ 中,一個更自然的方法是使 clearBrowser 成為與 WebBrowser 在同一個 namespace(名字空間)中的非成員函數:

namespace WebBrowserStuff {
 class WebBrowser { ... };
 void clearBrowser(WebBrowser& wb);
 ...
}
  相對于形式上的自然,這樣更適用于它。無論如何,因為名字空間(不像類)能展開到多個源文件中。這是很重要的,因為類似 clearBrowser 的函數是方便性函數。作為既不是成員也不是友元,他們沒有對 WebBrowser 進行專門的訪問,所以他們不能提供任何一種 WebBrowser 的客戶不能通過其它方法得到的功能。例如,假如 clearBrowser 不存在,客戶可以直接調用 clearCache,clearHistory 和 removeCookies 本身。

  一個類似 WebBrowser 的類可以有大量的方便性函數,一些是書簽相關的,另一些打印相關的,還有一些是 cookie 治理相關的,等等。作為一個一般的慣例,多數客戶僅對這些方便性函數的集合中的一些感愛好。沒有理由讓一個只對書簽相關的方便性函數感愛好的客戶在編譯時依靠其它函數,例如,cookie 相關的方便性函數。分隔它們的直截了當的方法就是在一個頭文件中聲明書簽相關的方便性函數,在另一個不同的頭文件中聲明 cookie 相關的方便性函數,在第三個頭文件聲明打印相關的方便性函數,等等:


// header "webbrowser.h" - header for class WebBrowser itself
// as well as "core" WebBrowser-related functionality
namespace WebBrowserStuff {

 class WebBrowser { ... };
 ... // "core" related functionality, e.g.
 // non-member functions almost
 // all clients need
}
// header "webbrowserbookmarks.h"
namespace WebBrowserStuff {
... // bookmark-related convenience
} // functions
// header "webbrowsercookies.h"
namespace WebBrowserStuff {
 ... // cookie-related convenience
} // functions

...
  注重這里就像標準 C++ 庫組織得一樣嚴密。勝于有一個單獨的一體式的 <C++StandardLibrary> 頭文件包含 std namespace 中的所有東西,它們在許多頭文件中(例如,<vector>,<algorithm>,<memory>,等等),每一個都聲明了 std 中的一些機能。僅僅需要 vector 相關機能的客戶不需要 #include <memory>,不用 list 的客戶沒有必要 #include <list>。這就答應客戶在編譯時僅僅依靠他們實際使用的那部分系統。當機能來自一個類的成員函數時,用這種方法分割它是不可能的,因為一個類必須作為一個整體來定義,它不能四分五裂。

  將所有方便性函數放入多個頭文件中——但是在一個 namespace 中——也意味著客戶能輕易地擴充方便性函數的集合。他們必須做的全部就是在 namespace 中加入更多的非成員非友元函數。例如,假如一個 WebBrowser 的客戶決定寫一個關于下載圖像的方便性函數,他或她僅僅需要新建一個頭文件,包含那些函數在 WebBrowserStuff namespace 中的聲明。這個新的函數現在就像其它方便性函數一樣可用并被集成。這是類不能提供的另一個特性,因為類定義對于客戶是擴充封閉的。當然,客戶可以派生新類,但是派生類不能訪問基類中被封裝的(也就是說,private 的)成員,所以這樣的“擴充機能”只有二等身份。此外,不是所有的類都是作為基類設計的。

  Things to Remember

  ·用非成員非友元函數取代成員函數。這樣做可以提高封裝性,包裝彈性,和機能擴充性。

上一篇:在 C++中處理錯誤

下一篇:再談CMOS密碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美综合国产精品久久丁香| 色午夜这里只有精品| 久久久999国产精品| 在线精品视频视频中文字幕| 亚洲人成在线免费观看| 91免费视频网站| 国产精品日日摸夜夜添夜夜av| 国产精品户外野外| 欧美夫妻性生活xx| 日韩电影视频免费| 视频在线观看一区二区| 国产日韩中文字幕| 国产精品三级网站| 亚洲bt欧美bt日本bt| 亚洲欧美综合精品久久成人| 国产性色av一区二区| 91久久精品日日躁夜夜躁国产| 亚洲精品永久免费| 国产欧美日韩丝袜精品一区| 91美女福利视频高清| 久久电影一区二区| 91国偷自产一区二区三区的观看方式| 欧美日本精品在线| 日韩中文在线中文网三级| 亚洲国产精久久久久久久| 国产精品男人爽免费视频1| 91精品国产精品| 另类视频在线观看| 国产午夜一区二区| 国产精品男人的天堂| 精品视频—区二区三区免费| 欧美人在线视频| 亚洲伊人第一页| 欧美日韩美女在线| 亚洲国产精品资源| 欧美xxxwww| 久久亚洲精品一区二区| 色一情一乱一区二区| 国产精品入口免费视频一| 激情亚洲一区二区三区四区| 精品色蜜蜜精品视频在线观看| 91精品国产91久久久久久吃药| 欧美午夜宅男影院在线观看| 亚洲人成伊人成综合网久久久| 亚洲欧美日韩精品久久| 九九热这里只有精品免费看| 国产精品最新在线观看| 欧美成人中文字幕在线| 亚洲精品资源美女情侣酒店| 国产精品久久久久久中文字| 2024亚洲男人天堂| 亚洲人成电影网站| 欧美日韩国产精品一区二区三区四区| 欧美激情视频在线观看| 91成人在线观看国产| 91精品国产免费久久久久久| 欧美影院久久久| 亚洲国产精品中文| 92福利视频午夜1000合集在线观看| 国内精品久久久久久| 欧美极品欧美精品欧美视频| 日本精品久久中文字幕佐佐木| 日韩经典一区二区三区| 国产成人97精品免费看片| 久久亚洲综合国产精品99麻豆精品福利| 热久久美女精品天天吊色| 中文字幕精品一区久久久久| 亚洲午夜国产成人av电影男同| 日韩女优人人人人射在线视频| 国产剧情日韩欧美| 性欧美xxxx交| 日韩成人在线播放| 久久免费精品日本久久中文字幕| 成人免费激情视频| 日韩精品极品视频| 日本在线精品视频| 岛国av一区二区在线在线观看| 成人激情免费在线| 97视频免费在线看| 精品中文视频在线| 久久精品国产欧美亚洲人人爽| 欧美日韩激情视频| 欧美日韩高清区| 欧美在线视频免费播放| 亚洲精品中文字幕有码专区| 亚洲a∨日韩av高清在线观看| 久久国产精彩视频| 亚洲а∨天堂久久精品9966| 久久免费视频在线观看| 亚洲欧美制服另类日韩| 欧美一区二区大胆人体摄影专业网站| 亲子乱一区二区三区电影| 成人写真视频福利网| 国产这里只有精品| 久久久免费观看| 日韩精品中文在线观看| 日本道色综合久久影院| 91亚洲国产成人精品性色| 欧美成人亚洲成人日韩成人| 91大神福利视频在线| 亚洲欧美日韩精品久久奇米色影视| 在线视频国产日韩| 中文字幕亚洲一区二区三区五十路| 亚洲人成在线播放| 91国偷自产一区二区三区的观看方式| 91精品国产电影| 国产精品嫩草影院一区二区| 国模私拍一区二区三区| 国产精品自产拍在线观看| 国产精品一区二区av影院萌芽| 欧美一级大胆视频| 国产成人午夜视频网址| 国产亚洲精品激情久久| 国产成人精品免费久久久久| 亚洲成人a级网| 欧美美最猛性xxxxxx| 午夜免费日韩视频| 日韩av片电影专区| 91免费精品视频| 日韩精品亚洲元码| 亚州国产精品久久久| 欧美老少做受xxxx高潮| 亚洲电影天堂av| 久久久综合免费视频| 超碰日本道色综合久久综合| 伊人久久久久久久久久久久久| 一区二区三区国产在线观看| 亚洲天天在线日亚洲洲精| 亚洲欧美国内爽妇网| 538国产精品一区二区免费视频| 欧美孕妇与黑人孕交| 成年无码av片在线| 欧美孕妇性xx| 国产成人精品免高潮在线观看| 亚洲性夜色噜噜噜7777| 国产mv久久久| 狠狠躁夜夜躁人人爽天天天天97| 国产精品视频免费观看www| 亚洲最大中文字幕| 欧美日韩裸体免费视频| 久久成人综合视频| 欧美一级在线亚洲天堂| 国产精品久久久久久久久久ktv| 欧美成人在线免费| 米奇精品一区二区三区在线观看| 97精品视频在线| 亚洲激情免费观看| 欧美日韩国产精品一区二区不卡中文| 亚洲成人av在线| 永久免费毛片在线播放不卡| 欧美丰满少妇xxxx| 91精品在线国产| 久久手机精品视频| 亚洲人av在线影院| 欧美在线一级va免费观看| 亚洲欧美色图片| 久久精品99久久久久久久久| 欧美在线观看日本一区| 九九热这里只有精品6| 国产va免费精品高清在线观看| 欧美巨乳在线观看| 日韩av一区二区在线| 日韩欧美精品网站| 亚洲老头同性xxxxx|