.# 條款18:讓介面容易被正確使用,不容易被誤用
保持函式名的一致性:也就是說具有相同功能的函式最好命名是一致的,這樣設計的理由就是讓別人(包括自己)用起來不會因為命名混亂而錯誤使用;
函式名語義清晰:最好能讓人一眼看出這個函式的功能;
2.輸入引數:
語義清晰:我們可以使用精確的命名,讓呼叫者可以直接明白引數的含義,也可以利用const關鍵字標識傳輸引數是否會被修改;
盡可能保證引數不會被錯誤呼叫:比如class的建構函式所接受的引數必須在某個範圍內才有效,就可以利用non-local-
static物件轉換為local-
static物件的思路,將建構函式宣告為private,且只將每個合理輸入都成為乙個public的static成員函式,通過呼叫private建構函式的方式返回乙個類物件,這樣就保證了使用者只能通過我提供的這些static成員函式去建立類物件,建立出的類物件一定都是在合理範圍內的。
保證傳入引數的效率:盡可能by reference,對於不修改傳入引數的函式,進一步用by reference to const
;
3.返回值:
如果希望返回乙個函式內部生成的物件,那就要想辦法避免使用者忘記釋放記憶體而造成記憶體洩露,一種比較好的方法就是利用shared_ptr指標。
如果要返回的物件在函式呼叫前不存在,那麼必然要在函式內建立乙個物件,然後試圖返回其引用。然而不論這個物件是建立在棧上,堆上(函式呼叫結束後可能無法delete),還是static(實際客戶**可能需要多個物件,而這個函式多次呼叫實際只有第一次呼叫時得到乙個物件,後面就不會建立了,如果返回引用的話,實際這些引用指向的是同乙個static物件)都有隱患,所以就別想了。
封裝:更少**能看到它,我們就有更大彈性去改變它而僅僅影響少數**;當修改封裝的成分時,盡可能減小**的修改量;萬一出了bug,只需在成員函式和友元內檢查;
classa;
void
f(a& a)
;//宣告為普通的非成員非友元函式,就只能通過a去訪問類的public成分,因此封裝性更好
//標頭檔案a.h
namespace lixu;}
//標頭檔案a1.h
namespace lixu
設計與宣告
預設情況下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 乍見之下這個介面通情達理,但是至少容易犯兩個錯誤。第一,他們可能以錯誤的次序傳遞引數 第二,他們可能傳遞乙個無效的引數。許多客戶端錯誤可以因...