測試**如下:
#include class**很簡單,最終的結果怎樣呢?testsingleton
static testsingleton& getinstance(int
i)
private
: testsingleton(
inti):m_i(i)
intm_i;
};int
main()
我原本以為1和2都會輸出的,因為兩次分別呼叫getinstance時用的是不一樣的引數,所以應該會例項出兩個不一樣的testsingleton物件吧,最終的結果和我料想的有所不同:
只構造出了引數為1的singleton物件,並沒與改造出引數為2的物件,這是為什麼呢?仔細思考了一下,然後就頓悟了,哎,原因還是出了對static關鍵字的理解不深,這麼快就忘記了。
在函式體中,如果宣告了乙個static變數,不管進入這個函式多少次,該static變數只會被初始化一次。
所以當我第二次呼叫getinstance函式時,進入getinstance後直接就跳過了testsingleton的初始化語句,也就是testsingleton的建構函式,因此最終得到的testsinglon物件和上次的是同乙個。我打斷點除錯的時候發現確實如此。
從這裡我收穫了乙個小小的道理,單例模式的建構函式不應該傳參,如果需要傳參的話,這個類就應該被設計為普通類。因為如果需要傳參的話,就很根據不同的引數生成不同的類的例項,與單例類「乙個類只存在乙個物件」的設定不符。
其實道理與下面這個是相似的。
void fun(int最終兩次的輸出結果依然都是1,因為m只被初始化一次。i)int
main()
void fun(int最終的輸出仍然為兩個1,這段和上段**有點類似於類的拷貝構造和賦值構造 都是」建構函式」。i)int
main()
void fun(int這樣的話輸出結果就變成乙個1和乙個2了。i)int
main()
乙個單例模式的簡單例子
ex1 public class singleton public static singleton getinstance return singleton 這個不多說了,肯定是錯誤的,如果多個執行緒訪問的時候都是 null,那麼接下來就是產生多個例項。不算單例模式。ex2 public clas...
設計乙個簡單的單例設計模式
概念 單例模式 singleton pattern 涉及乙個單一的類,確保只有單個物件被建立。這個類提供一種訪問其唯一物件的方式,可以直接訪問,不需要例項化該類的物件。注意 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。1.餓漢式 餓漢式是...
如何設計乙個單例模式
單例類最簡單的c 實現 class single single static single getinstance return m pinstance single single m pinstance null 單例要求 參考 劍指offer c 保證執行緒安全 class single ret...