Effective C 經驗條款

2021-06-27 15:57:04 字數 1392 閱讀 3325

高效c++ -4

必須返回物件時,別妄想返回其reference:

這句話什麼意思呢?就是在乙個函式內,如果你需要這個函式返回乙個新的物件,那麼這個函式的返回值型別就不要定義成引用型別。就直接返回這個類型別。

首先,我們知道在函式傳遞引數時,傳遞引用的好處,尤其是對那麼比較大的型別,但是對於內建型別和stl的迭代器型別就沒有必要使用引用傳遞,就可以使用值傳遞。因為對於內建型別傳遞引用不值得。

下面看乙個例子,為何在必須返回物件時,就別想返回物件的引用。因為得到了函式傳遞引用的好處,有人可能在返回值時也想返回引用。

比如乙個rational(實數類)類,過載了操作符*,然會乙個新的物件。

const rational& operator*(constrational& lhs,const rational& rhs)

rationalresult(lhs.n*rhs.n,lhs.d*rhs.d);

return result;

然會乙個引用,乙個區域性變數的引用,在函式結束以後,這個result就消失了,他是在棧空間內的,返回這個是不合適的?

那麼這個時候就想著在堆空間中申請空間,然後返回。

const rational& operator*(constrational& lhs,const rational& rhs)

rational* result = new rational(lhs.n*rhs.n,lhs.d*rhs.d);

return   *result;

這更不合適,在這個函式內申請一段空間,並對這段空間進行初始化然後返回。但是這段空間誰去釋放呢?如果是在複雜應用中,更加複雜,這是更不應該的行為。

那麼,可能想到了返回staic變數,還是不是很好,以為staic變數誰去呼叫都是同乙個。

其實,到最後,如果乙個函式必須返回乙個物件,那麼就直接返回物件就好了,這是很好的做法。

inline const rational operator*(constrational& lhs,const rational& rhs)

returnrationl(lhs.n*rhs.n,lsh.d*rhs.d);

但是對於過載操作符operator=則要求一定返回 reference *this

virtual函式系動態繫結而來,意思是呼叫乙個virtual函式時,究竟呼叫哪乙份實現**,取決於發出呼叫的那個物件的動態型別。

virtual函式是動態繫結,而預設引數值卻是靜態繫結。意思是你肯呢過會在「呼叫乙個定義於derived class內的virtual函式」的同時,卻使用base class為它所指定的預設引數值。什麼是動態型別什麼是靜態型別呢?動態型別是這個指標指向的物件時什麼型別,靜態型別是這個指標的宣告型別是什麼?

絕對不要重新定義乙個繼承而來的預設引數值,因為預設引數值都是靜態繫結,而virtual函式是動態繫結。

Effective C 經驗條款

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

effective c 條款總結

條款1 盡量用const 和inline 而不用 define 條款2 盡量用而不用 條款3 盡量用new delete 而不用malloc free 條款4 盡量使用c 風格注釋 條款5 對應的new和delete 都要採用相同的形式 條款6 析構函式裡對指標成員呼叫delete條款 條款7 預先...

effective c 條款01 整理

書中將c 劃分為4個次語言,期望將混亂的c 體系進行簡單的梳理,只能說目的達到了,但這麼分合適不合適呢?不知道.1 c c without class 初級c 確實是對c的延生,這也涉及到c 是否應該嚴格相容c的問題,歷史問題不去評判,但這是事實。2 物件導向c object oriented c ...