高效C++,高效課堂
Effective C++
指標和引用的不同:
指標在定義的時候就必須進行初始化,如果在使用的過程中,這個變數可能指向為空白,那麼就不要使用引用,就需要使用指標。
指標域引用的另一個重要的不同是指標可以被重新定義賦值以指向另一個不同的對象。但是引用則總是指向在初始化時被指定的對象,以後不能改變,如果改變了應用的值,那麼引用指向的對象就被修改了。
在以下情況下你應該使用指標,一是你考慮到存在不指向任何對象的可能(在這種情況下,你能夠設定指標為空白),二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指標的指向)。如果總是指向一個對象並且一旦指向一個對象後就不會改變指向,那麼你應該使用引用。
當你知道你必須指向一個對象並且不想改變其指向時,或者在重載操作符並為防止不必要的語義誤解時,你不應該使用指標。而在除此之外的其他情況下,則應該使用指標。
C++中的類型轉換:
Const_cast:專門用來去除const屬性;static_cast:類型於C中的強制類型轉換。
Dynaminc_cast:用來基類和繼承類之間的轉換:
Reinterpret_cast:一般用來在函數指標類型之間進行轉換。
不要對數組使用多態:
類繼承的最重要的特性是你可以通過基類指標或引用來操作衍生類別。這樣的指標或引用具有行為的多態性。但是如果使用數組來實現多態是錯誤的。在實現析構也是錯誤的。
隱式類型轉換建構函式,比如避免但參數的建構函式和內建資料類型的轉換就需要使用關鍵字explicit
自增、自減操作符首碼形式與尾碼形式的區別:
C++允許重載increment和decrement操作符的兩種形式。重載函數間的區別決定於他們的參數類型上的差異,但是不論Increment和decrment的首碼還是尾碼都是只有一個參數。為瞭解決這個語言問題,C++規定尾碼形式有一個Int型別參數,當函數被調用時,編譯器傳遞一個0做為Int參數的值給該函數。一個返回引用,一個返回臨時變數。尾碼操作符函數沒有使用它的參數,他的參數只是用來分區首碼與尾碼函數調用。
Placement new操作就是在一塊存在的記憶體中初始化自己的對象,比如你已經擁有了一段堆空間,你想在這塊堆空間上初始化一個對象,就可以使用這個操作。
所謂default建構函式是一個可被調用而不帶任何實參者。這樣的建構函式要不沒有參數,要不就是每個參數都有預設值。有的類的建構函式被聲明為explicit,這可阻止他們被用執行隱式類型轉換,但他們仍可被用來進行顯示類型轉換。他禁止編譯器執行非預期的類型轉換。Copy建構函式被用來“以同型對象初始化自我對象”,copy asignment操作符被用來“從另一個同型對象中拷貝其值到自我對象”。
Widget w1; //調用default建構函式
Widget w2(w1); //調用copy建構函式
W1 = w2; //調用copy assignment操作符
當看到賦值符號時請小心,因為”=”文法也可用來調用copy建構函式:
Widget w3 =w2; //調用copy建構函式
Copy構造和copy賦值有所區別。如果一個新對象被定義(例如以上語句的w3),一定會有個建構函式被調用,不可能調用賦值操作。如果沒有新對象被定義(例如上面的w1 = w2),就不會有建構函式被調用,那麼當然就是賦值操作被調用。
Copy建構函式是一個尤其重要的函數,因為它定義一個對象如何passed by value(以值傳遞),當一個函數的參數是一個類類型,實參傳遞程序呼叫了copy建構函式,passed-by-value意味調用copy建構函式。