日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 私有构造函数的作用

發布時間:2025/3/15 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 私有构造函数的作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++ 私有構造函數的作用

分類: C/C++ 1536人閱讀 評論(1) 收藏 舉報 c++classdeleteobjectvector編譯器

?很多情況下要求當前的程序中只有一個object。例如一個程序只有一個和數據庫的連接,只有一個鼠標的object。通常我們都將構造函數的聲明置于public區段,假如我們將
其放入private區段中會發生什么樣的后果?這意味著什么?
????? 當我們在程序中聲明一個對象時,編譯器為調用構造函數(如果有的話),而這個調用將通常是外部的,也就是說它不屬于class對象本身的調用,假如構造函數是私有的,
由于在class外部不允許訪問私有成員,所以這將導致編譯出錯。
????? 然而,對于class本身,可以利用它的static公有成員,因為它們獨立于class對象之外,不必產生對象也可以使用它們。
????? 此時因為構造函數被class私有化,所以我們要創建出對象,就必須能夠訪問到class的私有域;這一點只有class的成員可以做得到;但在我們建構出其對象之前,怎么能利用它的成員呢?static公有成員,它是獨立于class對象而存在的,“我們”可以訪問得到。假如在某個static函數中創建了該class的對象,并以引用或者指針的形式將其返回(這里不以對象返回,主要是構造函數是私有的,外部不能創建臨時對象),就獲得了這個對象的使用權。
????? 下面是例子:

[cpp] view plaincopy
  • <span?style="font-family:SimSun;font-size:16px;">class?OnlyHeapClass??
  • {??
  • public:??
  • ???static?OnlyHeapClass*?GetInstance()??
  • ???????{??
  • ??????????????//?創建一個OnlyHeapClass對象并返回其指針??
  • ??????????????return?(new?OnlyHeapClass);??
  • ???????}??
  • ???void?Destroy();??
  • private:??
  • ???????OnlyHeapClass()?{?}??
  • ???????~OnlyHeapClass()?{}??
  • };??
  • int?main()??
  • {??
  • ???????OnlyHeapClass?*p?=?OnlyHeapClass::GetInstance();??
  • ???????...?//?使用*p??
  • ???????delete?p;??
  • ???????return?0;??
  • }</span>??


  • ????? 這個例子使用了私有構造函數,GetInstance()作為OnlyHeapClass的靜態成員函數來在內存中創建對象:由于要跨函數傳遞并且不能使用值傳遞方式,所以我們選擇在堆上
    創建對象,這樣即使getInstance()退出,對象也不會隨之釋放,可以手動釋放。
    ????
    ????? 構造函數私有化的類的設計保證了其他類不能從這個類派生或者創建類的實例,還有這樣的用途:例如,實現這樣一個class:它在內存中至多存在一個,或者指定數量個
    的對象(可以在class的私有域中添加一個static類型的計數器,它的初值置為0,然后在GetInstance()中作些限制:每次調用它時先檢查計數器的值是否已經達到對象個數的
    上限值,如果是則產生錯誤,否則才new出新的對象,同時將計數器的值增1.最后,為了避免值復制時產生新的對象副本,除了將構造函數置為私有外,復制構造函數也要特別
    聲明并置為私有。
    ????? 如果將構造函數設計成Protected,也可以實現同樣的目的,但是可以被繼承。

    ?????? 另外如何保證只能在堆上new一個新的類對象呢?只需把析構函數定義為私有成員。
    ????? 原因是C++是一個靜態綁定的語言。在編譯過程中,所有的非虛函數調用都必須分析完成。即使是虛函數,也需檢查可訪問性。因些,當在棧上生成對象時,對象會自動析構,也就說析構函數必須可以訪問。而堆上生成對象,由于析構時機由程序員控制,所以不一定需要析構函數。保證了不能在棧上生成對象后,需要證明能在堆上生成它。這里OnlyHeapClass與一般對象唯一的區別在于它的析構函數為私有。delete操作會調用析構函數。所以不能編譯。
    ?????? 那么如何釋放它呢?答案也很簡單,提供一個成員函數,完成delete操作。在成員函數中,析構函數是可以訪問的。當然detele操作也是可以編譯通過。?
    void OnlyHeapClass::Destroy() {?
    ??????? delete this;?
    }?
    ??? 構造函數私有化的類的設計可以保證只能用new命令在堆中來生成對象,只能動態的去創建對象,這樣可以自由的控制對象的生命周期。但是,這樣的類需要提供創建和撤銷
    的公共接口。
    ??? 另外重載delete,new為私有可以達到要求對象創建于棧上的目的,用placement new也可以創建在棧上。



    ---------------------------------------------------------------------------------------------------------------------------------
    還是不懂啊: ??
    ? 1.為什么要自己調用呢?對象結束生存期時不就自動調用析構函數了嗎?什么情況下需要自己調用析構函數呢? ??
    ? ================================================================ ??
    ? 比如這樣一種情況,你希望在析構之前必須做一些事情,但是用你類的人并不知道, ???那么你就可以重新寫一個函數,里面把要做的事情全部做完了再調用析構函數。 ??這樣人家只能調用你這個函數析構對象,從而保證了析構前一定會做你要求的動作。 ??
    ? ??
    ? 2.什么情況下才用得著只生成堆對象呢? ??
    ? ================================ ??
    ? 堆對象就是new出來的,相對于棧對象而言。什么情況下要new,什么情況下在棧里面 ???提前分配,無非就是何時該用動態,何時該用靜態生成的問題。這個要根據具體情況 ??
    ? 具體分析。比如你在一個函數里面事先知道某個對象最多只可能10個,那么你就可以定義這個對象的一個數組。10個元素,每個元素都是一個棧對象。如果你無法確定數字,那么你就可以定義一個這個對象的指針,需要創建的時候就new出來,并且用list ??或者vector管理起來。???

    ---------------------------------------------------------------------------------------------------------------------------------
    類中“私有”權限的含義就是:私有成員只能在類域內被訪問,不能在類域外進行訪問。 ??
    ? ??
    ? 把析構函數定義為私有的,就阻止了用戶在類域外對析構函數的使用。這表現在如下兩個方面: ??
    ? ??
    ? 1. ? 禁止用戶對此類型的變量進行定義,即禁止在棧內存空間內創建此類型的對象。要創建對象,只能用 ? new ? 在堆上進行。 ??
    ? ??
    ? 2. ? 禁止用戶在程序中使用 ? delete ? 刪除此類型對象。對象的刪除只能在類內實現,也就是說只有類的實現者才有可能實現對對象的 ? delete,用戶不能隨便刪除對象。如果用戶想刪除對象的話,只能按照類的實現者提供的方法進行。 ??
    ? ??
    ? 可見,這樣做之后大大限制了用戶對此類的使用。一般來說不要這樣做;通常這樣做是用來達到特殊的目的,比如在 ? singleton ? 的實現上。樓主可查找 ? singleton ? 的資料來了解它是怎么一回事。

    總結

    以上是生活随笔為你收集整理的C++ 私有构造函数的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。