條款18:讓介面容易被正確使用,不易被誤用
條款19:設計class猶如設計type
條款20:寧以pass-by-value-to-const替換pass-by-value
預設情況下c++以by value方法給物件傳遞引數,函式引數都是物件的副本,這些副本是由物件的copy建構函式產出,這可能使得函式呼叫操作更加費時(一次copy建構函式的呼叫,函式結束時一次析構函式的呼叫)。
可以將函式宣告為下面的形式,這樣將不會有任何額外的建構函式和析構函式的呼叫:
void func (const student& student)
引數宣告中的const是重要的,可以讓呼叫者知道函式內不會對student做出任何修改。
這種方法還可以避免引數作為其父類傳入函式後,函式內僅僅留下父類物件的情況。
這個規則並不適用於內建型別、stl的迭代器以及函式物件。
條款21:必須返回物件時,別妄想返回其reference
任何函式返回乙個reference指向某個local物件結果都將是錯誤的,因為local物件在函式結束後就會被銷毀。
條款22:將成員變數宣告為private
條款23:寧以non-member、non-friend替換member函式
non-member、non-friend函式能提供比member函式更高的封裝性。
封裝的好處在於我們能改變事物而只影響有限的客戶。可以粗略的說,越多函式可以訪問到乙個類,這個類的封裝性越差。
通常的做法是讓non-member函式跟相對應的類放到同一命名空間下:
namespacewebbrowserstuff ;
void
clearbrowser() ;
...}
條款24:若所有引數皆需型別轉換,請為此採用non-member函式
條款25:考慮寫出乙個不拋異常的swap函式
設計與宣告
預設情況下c 是以值傳遞的形式傳遞物件到函式的。除非特別指定,否則函式引數都是以實際實參的副本為初值。呼叫端所獲的也是函式返回值的乙個副本。這些副本是由物件的拷貝建構函式產生,這會使值傳遞非常費時。特別是在乙個結構複雜的類中,例如 class student public person當有以下函式 ...
設計與宣告(一)
條款18 讓介面容易被正確使用,不易被誤用 開發乙個 容易被正確使用,不易被誤用 的介面,首先必須考慮使用者會做出什麼樣的錯誤。以下為例 class date 乍見之下這個介面通情達理,但是至少容易犯兩個錯誤。第一,他們可能以錯誤的次序傳遞引數 第二,他們可能傳遞乙個無效的引數。許多客戶端錯誤可以因...
二 設計與宣告
類的設計是一件非常複雜的事情,設計師在設計類的時候不僅僅要考慮實現的功能,又要兼顧擴充套件性 易用性等一些功能外的特性。在使用外部庫的時候,在不查閱文件的基礎上,我們常常煩惱於如何呼叫api,一些引數非常容易混淆。舉乙個例子我們在學生系統中要對一名學生進行輸入生日的操作。item19常常我們使用a ...