EffectiveC 學習筆記 條款22 23

2021-08-03 02:54:07 字數 1359 閱讀 5602

條款22 將成員變數宣告為private

注意一點protected並不比public更具有封裝性

條款23 使用non-member、non-friend替換member函式

總結一下書上講的:

class webbrowser

//執行這些操作可以提供乙個成員函式

void cleareverything();//呼叫3個函式

//或者提供乙個非成員函式

void clearbrowser(webbrowser& wb);//呼叫3個函式

書上選擇了第二個並且給出了比較好的方案:

namespace webbrowserstuff;

void clearbrowser(webbrowser& wb);

...}

根據物件導向守則的要求,資料以及運算元據的函式應該**在一起,都放在類中,這意味著把它放在類內會比較好。但從封裝性的角度而言,它卻放在類外好,為什麼?

為了區分開,我們把在類內的總清除函式稱之為cleareverything,而把類外的總清除函式稱之為clearwebbrower。cleareverything對封裝性的衝擊更大,因為它位於類內,這意味著它除了訪問這三個公有函式外,還可以訪問到類內的私有成員,是的,你也許會說現在這個函式裡面只有三句話,但隨著功能的擴充,隨著程式設計師的更替,這個函式的內容很可能會逐漸「豐富」起來。而越「豐富」說明封裝性就會越差,一旦功能發生變更,改動的地方就會很大。

再回過頭來看看類外的實現,在clearwebbrowser()裡面,是通過傳入webbrower的形參物件來實現對類內公有函式的訪問的,在這個函式裡面是絕對不會訪問到私有成員變數(編譯器會為你嚴格把關)。因此,clearwebbrowser的封裝性優於類內的cleareverything。

但這裡有個地方需要注意,clearwebbrower要是類的非友元函式,上面的敘述才有意義,因為類的友元函式與類內成員函式對封裝性的衝擊程度是相當的。

看到這裡,你也許會爭辯,把這個總清除的功能函式放在類外,就會割離與類內的關聯,邏輯上看,這個函式就是類內函式的組合,放在類外會降低類的內聚性。

為此,書上提供了命名空間的解決方案,事實上,這個方案也是c++標準程式庫的組織方式,好好學習這種用法很有必要!

namespace與class不同,前者可以跨越多個原始碼檔案,而後者不能。通過命名空間的**,是在封裝和內聚之間非常好的平衡。

最後總結一下,本條款強調封裝性優先於類的內聚邏輯,這是因為「愈多東西被封裝,愈少人可以看到它,而愈少人看到它,我們就有愈大的彈性去改變它,因為我們的改變僅僅影響看到改變的那些人或事物」。採用namespace可以對內聚性進行良好的折中。

Effective C 學習筆記

學習effective c 已經有相當長的一段時間了,今天抽出時間又堵了一遍第一部分 c語言 c 以c語言為基礎,幾乎支援所有的c語言成分,例如區塊 語句 預處理 內建資料型別 陣列 指標等,c語言的侷限是 沒有模板 沒有異常 沒有過載 物件導向的c 也就是加上了物件特性的c,類 封裝 繼承 多型 ...

Effective C 學習筆記

1 c 是乙個複合式的語言 c 中不同部分有著不同的語言特性,例如 1.1 在c中傳遞形參時,按照值傳遞比按照指標傳遞效率更高 1.2 在物件導向程式中,物件要按照const引用而不是按照值傳遞 1.3 在stl程式設計中採取按照值傳遞方式 所以說c 中沒有統一的準則,要按照不同的特性採取不同的使用...

effective c 學習筆記

如果不考慮應用程式的使用場合,僅僅考慮語言的靈活性,我贊成作者的想法。但是不同的應用它會有不同的效能要求,所以語言的選擇,應該是用 最適合 條款去選擇。使用巨集定義常量,若定義在標頭檔案中,則所有包含標頭檔案的都可以使用。巨集定義,在預處理的時候進行替換。巨集定義一些簡單的函式,可以減少呼叫開銷,但...