禁止拷貝建構函式

2021-08-09 14:44:57 字數 1187 閱讀 3040

拷貝建構函式在四種情況下被呼叫:

1、物件以值傳遞的方式傳入函式引數

2、物件以值傳遞的方式從函式返回

3、新建乙個物件並將其初始化為同類現有物件

如果我們沒有顯式的定義並實現拷貝建構函式,編譯器會生成乙個預設的拷貝建構函式。這種預設有時候會帶來一些不利的影響,因為預設拷貝建構函式是對非靜態類成員的簡單逐一拷貝(拷貝建構函式沒有處理靜態資料成員),此時若有指標等,會有意想不到的麻煩,也就是淺複製的侷限所在。

如果想要阻止系統自動生成可能不利的預設拷貝建構函式,可以自己對拷貝建構函式進行定義,如深複製(如果類中包含了使用new初始化的指標,應當定義乙個拷貝建構函式,以複製指向的資料,而不是指標)。

除了自定義拷貝建構函式外,有的時候還需要過載賦值運算子,因為編譯器依然會預設生成乙個淺複製的賦值運算子。

但是在實際的開發中,我們往往不希望乙個物件進行拷貝,此時如果在不自定義拷貝建構函式的同時,阻止編譯器生成預設拷貝建構函式呢?

(1)宣告乙個私有拷貝建構函式

首先,所有的編譯器生成的函式都是公有的(public),如果將拷貝建構函式和賦值運算子過載宣告為private,那麼將一舉兩得,第一阻止了編譯器自己生成預設建構函式,第二private許可權將使得該函式無法被外部自動呼叫。

但是,上述方法僅僅阻止了類外部的呼叫,類的成員函式和友元函式依然可以呼叫拷貝建構函式。假如我們沒有去定義這兩個討厭的函式,那麼就能解決這個問題,因為呼叫時編譯器會出現鏈結錯誤(而不是編譯錯誤)。

(2)繼承乙個uncopyable類

c++的編譯在鏈結之前,如果我們能在編譯期解決這個問題,會節省不少的時間,要想在編譯期解決問題,就需要人為製造一些bug。我們宣告乙個專門阻止拷貝的基類uncopyable。

class uncopyable

~uncopyable(){}

private:

uncopyable(const uncopyable&);

uncopyable& operator=(const uncopyable&);

}

接下來,我們的類只要繼承uncopyable,如果要發生拷貝,編譯器都會嘗試呼叫基類的拷貝建構函式或者賦值運算子,但是因為這兩者是私有的,會出現編譯錯誤。

拷貝建構函式,預設拷貝建構函式

拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...

建構函式 拷貝建構函式

建構函式可以分為三類 1 不帶引數的建構函式 在函式體中對資料成員賦初值,這種方式使該類的每乙個物件都得到同一組初值 2 帶引數的建構函式 如果使用者希望對不同的物件賦不同的初值,可以採用帶引數的建構函式。在呼叫不同物件的建構函式時從外面將不同的資料傳遞給建構函式,以實現初始化 3 複製建構函式 建...

建構函式 拷貝建構函式

person person 引用就是指標常量 所以person p person const p,引用所以一旦初始化指向某個位址,就不能在改變了。為什麼前面還要加const,因為拷貝建構函式的目的就是將乙個物件的所有屬性拷貝到另外乙個物件,這個物件的屬性不變,加上const 相當於 const pe...