對於堆中的對象,我們通常用new/delete來創建/銷毀。當調用new時,它會自動去調用相應類的構造函數。同樣,當調用delete時,它會自動去調用相應類的析構函數。當我們在棧中產生對象時,前面說的過程是自動完成的。即:不需要我們顯式調用new/delete。這裡有個前提:類的構造/析構都是public的。
然而,當我們想禁止在棧中產生對象時,如何來實現呢?
將構造函數設為private行嗎?no!這樣對象雖然不能在棧中產生,但同樣也不能在堆中產生了。
將析構函數設為private行嗎?bad!這樣雖然限制了棧對象,但同時也限制了繼承。
將析構函數設為protected行嗎?yes!
例如:
class A
{
protected:
A() { }
~A() { }
public:
static A* create()
{ return new A() ;//調用保護的構造函數 }
void destroy()
{ delete this ;//調用保護的析構函數 }
};
我們可以這樣來使用它:
A* pa= A::create();
pa->destroy() ;
摘自:huzzyy的專欄