M1:指針與引用的區(qū)別
1.指針可以指向空值,但是引用不行,它必須指向某個對象,因此引用必須初始化。
2.引用比指針效率高。
3.指針可以被重新賦值以指向另一個不同的對象。但是引用則總是指向在初始化時被指定的對象,以后不能改變。
summary:當(dāng)你知道你必須指向一個對象并且不想改變其指向時,或者在重載操作符并為防止不必要的語義誤解時,你不應(yīng)該使用指針。而在除此之外的其他情況下,則應(yīng)使用指針。
M2:盡量使用C++風(fēng)格的類型轉(zhuǎn)換
(static_cast, const_cast, dynamic_cast, 和reinterpret_cast).
const_cast用于類型轉(zhuǎn)換掉表達式的const或volatileness屬性
dynamic_cast,它被用于安全地沿著類的繼承關(guān)系向下進行類型轉(zhuǎn)換。它不能被用于缺乏虛函數(shù)的類型上
(參見條款M24),也不能用它來轉(zhuǎn)換掉constness
reinterpret_casts的最普通的用途就是在函數(shù)指針類型之間進行轉(zhuǎn)換,轉(zhuǎn)換結(jié)果幾乎都是執(zhí)行期定義
(implementation-defined)。因此,使用reinterpret_casts的代碼很難移植。轉(zhuǎn)換函數(shù)指針的代碼是
不可移植的(C++不保證所有的函數(shù)指針都被用一樣的方法表示),在一些情況下這樣的轉(zhuǎn)換會產(chǎn)生不正
確的結(jié)果(參見條款M31),所以你應(yīng)該避免轉(zhuǎn)換函數(shù)指針類型,除非你處于著背水一戰(zhàn)和尖刀架喉的危
急時刻。
static_cast在功能上基本上與C風(fēng)格的類型轉(zhuǎn)換一樣強大,含義也一樣 M3:不要對數(shù)組使用多態(tài)
語言規(guī)范中說通過一個基類指針來刪除一個含有派生類對象的數(shù)組,結(jié)果將是不確定的。多態(tài)和指針?biāo)惴ú荒芑旌显谝黄饋碛?,所以?shù)組與多態(tài)也不能用在一起。(array[I]只是一個指針?biāo)惴ǖ目s寫:它所代表的是*(array)。)
無用的缺省構(gòu)造函數(shù)不能確保對象進行了有意義的初始化,成員函數(shù)就會因為必須檢測成員的有效性而變得復(fù)雜, M5:謹(jǐn)慎定義類型轉(zhuǎn)換函數(shù)
隱式類型轉(zhuǎn)換運算符只是一個樣子奇怪的成員函數(shù):operator 關(guān)鍵字,其后跟一個類型符號。你不用定義函數(shù)的返回類型,因為返回類型就是這個函數(shù)的名字。
根本問題是當(dāng)你在不需要使用轉(zhuǎn)換函數(shù)時,這些的函數(shù)缺卻會被調(diào)用運行。結(jié)果,這些不正確的程序會做出一些令人惱火的事情,而你又很難判斷出原因。
克服隱式類型轉(zhuǎn)換運算符的缺點解決方法是用不使用語法關(guān)鍵字的等同的函數(shù)來替代轉(zhuǎn)換運算符。例如為了把Rational對象轉(zhuǎn)換為double,用asDouble函數(shù)代替operator double函數(shù)
通過不聲明運算符(operator)的方法,可以克服隱式類型轉(zhuǎn)換運算符的缺點,但是單參數(shù)構(gòu)造函數(shù)沒有那么簡單。
容易的方法是利用一個最新編譯器的特性,explicit關(guān)鍵字。
第二就是用 proxy classes
template<class T>
class Array { public: class ArraySize { // 這個類是新的 public: ArraySize(int numElements): theSize(numElements) {} int size() const { return theSize; } private: int theSize; }; Array(int lowBound, int highBound);
Array(ArraySize size); // 注意新的聲明
... }; M6:自增(increment)、自減(decrement)操作符前綴形式與后綴形式的區(qū)別
UPInt& operator++(); // ++ 前綴 const UPInt operator++(int); // ++ 后綴 UPInt& operator--(); // -- 前綴 const UPInt operator--(int); // -- 后綴 他們返回值類型不同以及后綴操作符應(yīng)該以前綴操作符為基礎(chǔ)來實現(xiàn) M7:不要重載“&&”,“||”, 或“,” M8:理解各種不同含義的new和delete |
|