**:
melonstreet
想象有乙個銀行賬戶的類,每個人都可以開銀行賬戶。存在銀行利率這個成員變數,它不應該屬於物件,而應該屬於銀行這個類,由所有的使用者來共享。static修飾成員變數時,該成員變數放在程式的全域性區中,整個程式執行過程中只有該成員變數的乙份副本。而普通的成員變數存在每個物件的記憶體中,若把銀行利率放在每個物件中,是浪費了記憶體。
static成員函式與普通函式一樣,都是只有乙份函式的副本,儲存在程序的**段上。不一樣的是,static成員函式沒有this指標,所以它不能夠呼叫普通的成員變數,只能呼叫static成員變數。普通成員函式的呼叫需要通過物件來呼叫,編譯器會把物件取位址,作為this指標的實參傳遞給成員函式:
obj.func() ---> class :: fun(&obj);
而static成員函式即可以通過物件來呼叫,也可以通過類名稱來呼叫。
另乙個問題是static成員變數的定義。static成員變數必須在類外部進行定義:
class a
int a::a = 10; //②
注意①是宣告,②才是定義,定義為變數分配了記憶體。
這些可以用來應付一下面試,在實現單例模式的時候,static成員函式與static成員變數得到了使用,下面是一種稱為」餓漢式「的單例模式的實現:
class a
;private:
a();
a(const a & rhs);
static a a;
}
這裡把class a的建構函式都設定為私有,不允許使用者**建立物件。要獲取物件例項需要通過介面getinstance。」餓漢式「缺點在於無論有沒有**需要a,a都被建立出來。下面是改進的單例模式,稱為」懶漢式「:
class a
;private:
a();
a(const a& rsh);
...};
a& a::getinstance()
"懶漢式"只有在真正需要a時,呼叫getinstance才建立出唯一例項。這可以看成乙個具有拖延症的單例模式,不到最後關頭不幹活。很多設計都體現了這種拖延的思想,比如string的寫時複製,真正需要的時候才分配記憶體給string物件管理的字串。 漫談C 良好的程式設計習慣與程式設計要點 0
melonstreet 正文 假設現在我們要實現乙個複數類complex,在類的實現過程中探索良好的程式設計習慣。complex.h ifndef complex define complex class complex endif 防止標頭檔案的內容被多次包含。ifndef complex def...
良好程式設計習慣
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 不好的習...