從private建構函式談單例模式

2022-03-02 19:21:33 字數 970 閱讀 2915

今天實現乙個單例的時候,想到多執行緒getinstance()時可能會有問題,就查了一下單例的幾種實現方式。

有一種被稱為「餓漢式」的實現:

1

class

manager25

static manager*m_pinstance;67

public

:8 manager*getinstance()912

}1314 manager* manager::m_pinstance = new manager;

特點是:在靜態區域建立例項,可以保證呼叫getinstance()時永遠返回同乙個有效的指標,這樣完美解決多執行緒的問題。

我的疑惑在最後一行:

manager* manager::m_pinstance = new manager;

既然 manager的建構函式已經是private了,為什麼還能這樣new乙個物件呢?按理說,無法呼叫private建構函式,就無法建立物件啊。。。

我在測試時,程式列印了字串「called.」,說明private建構函式確實被呼叫了。

為了驗證不是**的問題,我寫了如下測試**:

int

main()

程式編譯失敗,無法呼叫private的建構函式。

我猜想:

靜態全域性變數是存放在data segment區域,而臨時物件是存放在stack/heap區域,這兩個地方有不同?

ps:上面的實現有個小問題,按照程式的規則「呼叫new,則必然要delete」,該全域性物件指標該由誰來delete呢?不太好處理。

最後使用了另外一種單例:

class

manager

public

: manager*getinstance()

}

建構函式 訪問許可權private

一 建構函式 具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫parent construct 如果子類沒有定義建構函式則會如同乙個普通的類方法一樣從...

把建構函式設成private

在c 11中,把建構函式設成private,提供靜態的makeshared方法,可以實現在類的建構函式執行完成後,執行特定的操作。如下所示的 在sharedtest的建構函式完成後,執行print函式 include include include class sharedtest public s...

建立private建構函式的物件

getconstructor 和getdeclaredconstructor 區別 getdeclaredconstructor class.parametertypes 返回指定引數的構造器,包括public的和非public的,當然也包括private的。getdeclaredconstruct...