高效C 經驗條款(一)

2021-06-27 15:12:17 字數 1705 閱讀 4163

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建構函式。

Effective C 經驗條款

高效c 4 必須返回物件時,別妄想返回其reference 這句話什麼意思呢?就是在乙個函式內,如果你需要這個函式返回乙個新的物件,那麼這個函式的返回值型別就不要定義成引用型別。就直接返回這個類型別。首先,我們知道在函式傳遞引數時,傳遞引用的好處,尤其是對那麼比較大的型別,但是對於內建型別和stl的...

Effective C 經驗條款

高效c 模板與泛型程式設計 在c 中模板體現的是編譯期多型,virtual體現的是執行期多型。關於typename的雙重含義 在宣告template引數時,不論使用keywordclass或typename,意義全然同樣。可是c 並不總是把class和typename視為等價。有時候必須使用type...

設計高效sql一般經驗談

1不用在sql語句使用系統預設的保留關鍵字 2盡量用exists 和 not exists 代替 in 和 not in 這條在sql2005之後,在索引一樣,統計資訊一樣的情況下,exists in效果是一樣的。以adventureworks資料庫為例,查詢在 humanresources.emp...