爲何要把類的構造函數定義爲private(轉)

通常我們都將構造函數的聲明置於public區段,假如我們將其放入private區段中會發生什麼樣的後果?沒錯,我也知道這將會使構造函數成爲私有的,這意味着什麼?

    我們知道,當我們在程序中聲明一個對象時,編譯器爲調用構造函數(如果有的話),而這個調用將通常是外部的,也就是說它不屬於class對象本身的調用,假如構造函數是私有的,由於在class外部不允許訪問私有成員,所以這將導致編譯出錯。

    你於是說:“哈哈。”我們製造了一個似乎無法產生對象的class.哦,當然,對於class本身,我們還可以利用它的static公有成員,因爲它們獨立於class對象之外,我們不必產生對象也可以使用它們。嗯,看來我們還是爲帶有私有構造函數的類找到了一個存在的理由。不過我們不應當滿足於此,因爲看上去應當還有發掘的餘地。

    首先我們來認真看一下是不是真的無法創建出一個具有私有構造函數的類對象。“呃,可能未必。”你現在也許會這樣說。這很好,讓我們再來看看爲什麼,沒錯,因爲構造函數被class私有化了,所以我們要創建出對象,就必須能夠訪問到class的私有域;但這一點“我們”是做不到的,那麼,誰能做得到呢?class的成員可以做得到;但在我們建構出其對象之前,怎麼能利用它的成員呢?噢,剛纔我們剛剛提到了static公有成員,它是獨立於class對象而存在的,當然,它也是公有的,“我們”可以訪問得到。假如在某個static函數中創建了該class的對象,並以引用或者指針的形式將其返回(不可以以值的形式返回,想想爲什麼),我們就獲得了這個對象的使用權。下面是例子:

class WonderfulClass
{
public:
       static WonderfulClass* makeAnObject()
       {
              // 創建一個WonderfulClass對象並返回其指針

              return (new WonderfulClass);
       }
private:
        WonderfulClass() { }
};


int main()
{
        WonderfulClass *p = WonderfulClass::makeAnObject();

       ... // 使用*p


       delete p;  // Not neccesary here, but it's a good habit.

       return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章