C++ 被沉沒于接口中。函數接口、類接口、模板接口。每一個接口都意味著客戶的代碼和你的代碼互相影響。假設你在和通情達理的人打交道,那些客戶也想做好工作。他們想要正確使用你的接口。在這種情況下,假如他們犯了一個錯誤,就說明你的接口至少有部分是不完善的。在理想情況下,假如一個接口的一種嘗試的用法不符合客戶的預期,代碼將無法編譯,反過來,假如代碼可以編譯,那么它做的就是客戶想要的。
if (a * b = c) ... // oops, meant to do a comparison! 實際上,這僅僅是另一條使類型易于正確使用而難以錯誤使用的普遍方針的一種表現:除非你有很棒的理由,否則就讓你的類型的行為與內建類型保持一致??蛻粢呀浿老?int 這樣的類型如何表現,所以你應該努力使你的類型的表現無論何時都同樣合理。例如,假如 a 和 b 是 int,給 a*b 賦值是非法的。所以除非有一個非常棒理由脫離這種表現,否則,對你的類型來說這樣做也應該是非法的。
std::tr1::shared_ptr<Investment> // attempt to create a null pInv(0, getRidOfInvestment); // shared_ptr with a custom deleter; // this won’t compile 唉,這不是合法的 C++。tr1::shared_ptr 的構造函數果斷要求它的第一個參數應該是一個指針,而 0 不是一個指針,它是一個 int。當然,它能轉型為一個指針,但那在當前情況下并不夠好用,tr1::shared_ptr 果斷要求一個真正的指針。用強制轉型解決這個問題:
std::tr1::shared_ptr<Investment> // create a null shared_ptr with pInv(static_cast<Investment*>(0), // getRidOfInvestment as its getRidOfInvestment); // deleter; see Item 27 for info on // static_cast 據此,實現返回一個以 getRidOfInvestment 作為 deleter 的 tr1::shared_ptr 的 createInvestment 的代碼看起來就像這個樣子: