c 的單例模式為什麼不直接全部使用static,而是非要例項化乙個物件?

時間 2021-05-11 23:16:02

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優化...