**:melonstreet 正文
假設現在我們要實現乙個複數類complex,在類的實現過程中探索良好的程式設計習慣。
complex.h:
# ifndef __complex__
# define __complex__
class complex
# endif
防止標頭檔案的內容被多次包含。
例如上面的成員函式:# ifndef __complex__
# define __complex__
class complex
double imag() const
private:
doubel re,im;
}# endif
double real () const
double imag() const
既然函式不會改變物件,那麼就如實說明,編譯器能幫你確保函式的const屬性,閱讀**的人也明確你的意圖。
而且,const物件才可以呼叫這些函式——const物件不能夠呼叫非const成員函式。
class complex
private:
doubel re,im;
}
在初始值列表中,才是初始化。在建構函式體內的,叫做賦值。
為complex 類新增乙個+=操作符:
class complex
使用引用避免類物件構造與析構的開銷,使用const確保引數不會被改變。內建型別的值傳遞與引用傳遞效率沒有多大差別,甚至值傳遞效率會更高。例如,傳遞char型別時,值傳遞只需傳遞乙個位元組;引用實際上是指標實現,需要四個位元組(32位機)的傳遞開銷。但是為了一致,不妨統一使用引用。
以引用方式返回函式區域性變數會引發程式未定義行為,離開函式作用域區域性變數被銷毀,引用該變數沒有意義。但是我要說的是,如果可以,函式應該返回引用。當然,要返回的變數要有一定限制:該變數的在進入函式前,已經被分配了記憶體。以此條件來考量,很容易決定是否要返回引用。而在函式被呼叫時才建立出來的物件,一定不能返回引用。
說回operator +=,其返回值就是引用,原因在於,執行a+=b時,a已經在記憶體上存在了。
而operator +,其返回值不能是引用,因為a+b的值,在呼叫operator +的時候才產生。
下面是operator+=與operator +的實現:
inline complex & complex :: operator += (const complex & r)
inline complex operator + (const complex & x , const complex & y)
在operator +=中返回引用還是必要的,這樣可以使用連續的操作:
c3 += c2 += c1;
就我們的複數類來說,+可以有多種使用方式:
complex c1(2,1);
complex c2;
c2 = c1 + c2;
c2 = c1 + 5;
c2 = 7 + c1;
為了應付怎麼多種加法,+需要有如下三種過載:
這是某次面試中,面試官大哥告訴我的。想想確實是有道理,類的使用者用起來也舒服,一眼就能看見介面inline complex operator+ (const complex & x ,const complex & y)
inline complex operator + (const complex & x, double y)
漫談C 良好的程式設計習慣與程式設計要點 2
melonstreet 想象有乙個銀行賬戶的類,每個人都可以開銀行賬戶。存在銀行利率這個成員變數,它不應該屬於物件,而應該屬於銀行這個類,由所有的使用者來共享。static修飾成員變數時,該成員變數放在程式的全域性區中,整個程式執行過程中只有該成員變數的乙份副本。而普通的成員變數存在每個物件的記憶體...
良好程式設計習慣
1.程式應該以注釋開頭,如時間,日期,用途,作者.2.在逗號後插入空格,增強程式可讀性.3.在宣告和執行語句間插入空行,以突出宣告語句,程式更清晰.4.在二元運算子兩端都插入空格,突出運算子,增強程式可讀性.5.與羅列大量if語句相比,if else語句效率要高,後者只要不滿足就跳過不需要遍歷.6....
良好的程式設計習慣
最近,看到一些程式設計技巧有意無意的去使用,然而這些技巧看起來很華麗,但有礙於良好的程式設計習慣。比如在輸出乙個陣列時,可以有以下兩種寫法 for int i 0 i len i 良好的習慣 cout arr i endl for int i 0 i len cout arr i endl 不好的習...