條款19 設計class猶如設計type

2022-07-06 01:48:09 字數 1227 閱讀 5811

當你定義了乙個新的class時,也就定義了乙個新的type。身為c++程式設計師,你有許多時間主要用來擴張你的型別系統。這意味著你並不只是class設計者,還是type設計者。過載函式和操作符,控制記憶體的分配和歸還,定義物件的初始化和終結…全都在你的手上。因此你應該帶著和「語言設計者當初設計語言內建型別時」一樣的謹慎來研討class的設計。

幾乎每乙個class都要求你面對以下提問。

新type的物件應該如何被建立和銷毀?

物件的初始化和物件的賦值該有什麼樣的差別?(對應不同的函式)

新type的物件如果被pass by value,意味著什麼?

什麼是新type的合法值?對於於class成員變數來說,通常只有某些數值集是有效的。那些數值集決定了你的class必須維護的約束條件,也就決定了你的成員函式(如建構函式,賦值函式)必須進行的錯誤檢查工作。它也影響函式丟擲的異常,以及函式異常明細。

你的新的type需要配合某個繼承體系嗎?有沒有受到vitual和non-virtual的影響?

你的新type需要什麼樣的轉換?如果要轉換,是不是要定義轉換函式?

什麼樣的操作符和函式對此新type而言是合理的?

什麼樣的標準函式應該駁回?那些正是你必須宣告為private者。

誰該取用新type成員?哪些是public?哪些是private?哪乙個class或function是此type的友元?

什麼是新type的未宣告的介面?

你的新type有多麼一般化?或許你其實並非定義乙個新type,而是定義一整個types家族。果真如此你就不該定義乙個新class,而是定義乙個新的class template。

你真的需要乙個新的type嗎?

條款19 設計class猶如設計type

class的設計就是type的設計,在定義乙個新的type之前,考慮以下問題 你的新type需要什麼樣的轉換?什麼樣的操作符核函式對此新的type是合理的?這個問題將決定你的class宣告哪些函式 什麼樣的標準函式應該被駁回 這些正是你必須宣告為private的 誰改取用新type的成員?這些幫助決...

條款18 25 設計與宣告

條款18 讓介面容易被正確使用,不容易被誤用 保持函式名的一致性 也就是說具有相同功能的函式最好命名是一致的,這樣設計的理由就是讓別人 包括自己 用起來不會因為命名混亂而錯誤使用 函式名語義清晰 最好能讓人一眼看出這個函式的功能 2.輸入引數 語義清晰 我們可以使用精確的命名,讓呼叫者可以直接明白引...

條款31提及pimpl設計模式

條款31 將檔案間的編譯依存關係降至最低 中提到,由於標頭檔案和其含入標頭檔案之間形成一種編譯依存關係,如果這些標頭檔案所依賴的其他標頭檔案有任何改變,那麼每乙個含入該標頭檔案的的檔案就要重新編譯。為了減少這種依賴關係,文中提到一種 將物件實現細目隱藏於乙個指標背後 的遊戲。針對person我們可以...