類的設計是一件非常複雜的事情,設計師在設計類的時候不僅僅要考慮實現的功能,又要兼顧擴充套件性、易用性等一些功能外的特性。
在使用外部庫的時候,在不查閱文件的基礎上,我們常常煩惱於如何呼叫api,一些引數非常容易混淆。舉乙個例子我們在學生系統中要對一名學生進行輸入生日的操作。
item19常常我們使用a->setbirthday(1993,4,5),在類中就是這麼定義void setbirthday(int years, int month,int day);但是在實際操作中,我們並不知道輸入順序容易造成輸入錯誤,如果我們能把year,month,day進行封裝,那麼原函式成為以下的一種情況a->setbirthday(year(1993),month(4),date(5)),雖然麻煩一些,但是可以有效避免錯誤。
這種另外乙個運用的方面是raii的資源管理,我們常用智慧型指針對資源進行管理,但是有時候使用者會忘記使用智慧型指標,我們可以在create函式返回值時設定成為智慧型指標防止忘記delete導致記憶體洩漏。
item 21/22都是講值傳遞和引用傳遞的問題,值傳遞有乙個致命的缺點就是會在函式裡面建立乙個副本,如果這個副本是乙個很大的類,那麼構造析構成本就很高,而引用傳遞本質是引用傳遞指標,也就是記憶體位址之間的傳遞,在效率上會高很多,但是item22給我們乙個提醒,返回值在一些情況下必須使用值傳遞。比如說,我們要對函式內建立的某個值進行傳遞,如果使用引用傳遞,那麼我們在return的時候將臨時位址傳遞給變數,但是當函式結束時,那麼臨時變數結束生命期,位址釋放,導致變數位址指向空位址,導致無法估計的錯誤。但是對於一些內建變數,stl的迭代器等一般使用值傳遞為主,因為在設計時,設計師原本就是根據值傳遞來設計的,指標傳遞效率可能比值傳遞更低。
item23關注類的封裝問題,為了使得類內建變數不被隨意訪問,因為內建變數被隨意訪問會導致各種問題
item24 25關注使用類成員函式和外部函式的問題…未完待續
設計與宣告
預設情況下c 是以值傳遞的形式傳遞物件到函式的。除非特別指定,否則函式引數都是以實際實參的副本為初值。呼叫端所獲的也是函式返回值的乙個副本。這些副本是由物件的拷貝建構函式產生,這會使值傳遞非常費時。特別是在乙個結構複雜的類中,例如 class student public person當有以下函式 ...
設計與宣告
條款18 讓介面容易被正確使用,不易被誤用 條款19 設計class猶如設計type 條款20 寧以pass by value to const替換pass by value 預設情況下c 以by value方法給物件傳遞引數,函式引數都是物件的副本,這些副本是由物件的copy建構函式產出,這可能使...
設計與宣告(一)
條款18 讓介面容易被正確使用,不易被誤用 開發乙個 容易被正確使用,不易被誤用 的介面,首先必須考慮使用者會做出什麼樣的錯誤。以下為例 class date 乍見之下這個介面通情達理,但是至少容易犯兩個錯誤。第一,他們可能以錯誤的次序傳遞引數 第二,他們可能傳遞乙個無效的引數。許多客戶端錯誤可以因...