1樓:XZiar
很多時候其實就是花括號換不換行的問題,兩方可能各自看不順眼,但其實都能用。
不過還是有一些很重要的區別的。
首先,靜態成員變數的初始化順序不可控。
比如a和b兩個變數,b需要通過a建立。
類的建構函式是能保證按照初始化列表順序來的,但如果寫成靜態成員的話……由於C++不存在靜態類的說法,也沒有靜態建構函式,所以並不能保證保證a在b之前被初始化。
其次,靜態成員的話是在編譯期就確定好了它的位置,而如果是通過函式返回乙個區域性靜態物件的話,那就是執行期才確定位置,並返回他的指標。
前者由於是編譯期確定,所以可能編譯器會多做一些不可告人的優化/改變。
最後static方法其實就相當於namespace,不過依靠類的private能「隱藏」一些函式/成員。而後者其實是真正的「單例」---是成員的方法,呼叫時需要這個物件的指標。
因此大概還有個不同就是,乙個可以當作用了語法糖的C函式,而另乙個則是正統的C++函式。
正因如此,後者能享受C++類的優點,比如virtual的多型;而前者能當作C函式匯出吧(此處存疑,我瞎猜的)。
相比之下,效能開銷我覺得是不需要考慮的。還是那句話,不做profile,不要過早優化。
2樓:徐辰
static成員訪問速度比較慢。
定義的時候每個成員前面都要加static,比較費手指。
C++11之前,static成員不能在類宣告裡初始化。
C++11之前,static不能保證執行緒安全。
還是那句話,如果你不用動態載入dll/so,其實也沒有別的什麼原因了。
3樓:戰略攻城一獅
從業務上來說既然使用類,那大多是為了構造複雜的資料模型,基本上會用到繼承,
而static 本質上屬於全域性變數,不能被繼承,那如果我需要每個派生類都之有乙份就實現不了了。
4樓:
你說的對。
所謂「模式」並不是強制要求,如果有必要,完全可以打破模式的。
但是getInstance的寫法是有好處的:
1. 提供了對「唯一物件」進行初始化的時機2. 大家都習慣這麼寫單例了,寫出來其他人一看就明白
c 單例模式的一點疑問,求解答?
歐文韜 既然是單例了,自然不允許拷貝和轉移啦。講道理是應該delete掉的。給你看個sample吧 除了你說的delete問題外還有些訪問許可權控制的問題 Xi Yang 說多一點 我認為單例實現成什麼樣子,完全取決於具體需要,根本不用那麼教條。比如 1 業務邏輯是否真的需要 盡可能 嚴格限制全域性...
c 如此繁瑣,為什麼大學不直接開展python課程?
語言只是一種工具,工具都有其合適的應用場景,你不能說一切都用c 或都用python。因此與精通一門程式語言相比,更重要的是掌握程式設計的思想和原理。一旦你入了門,就可以迅速上手任何常規語言。回到題目,c 比之python最大的優勢恰恰就是繁雜,你可以明明白白的看到值和引用的區別,記憶體的分配,范型,...
微軟為什麼不推出純文字模式的Windows server?
標準的Windows Server安裝時有選擇GUI或者Core模式,Core模式就是沒有桌面的,完全用命令列的,然而這個模式還是有圖形介面的,如果安裝乙個圖形介面的應用,就會看到原來的視窗還是會跳出來。同樣的,hyper v server 就是Windows server對hypervisor優化...