阻止拷貝的三種方式

2021-08-08 04:12:13 字數 1538 閱讀 4317

有些時候我們在定義乙個類的時候不希望其中的拷貝控制成員(拷貝構造和拷貝賦值)起作用,也就是阻止拷貝,這時候可能有人會想,那我們乾脆不定義這樣的拷貝控制函式不就ok了,但悲催的是如果自己不定義,好心的編譯器也會及時的學習雷鋒好榜樣幫你合成定義,即傳說中的合成拷貝構造、合成拷貝賦值。既然如此,應該如何操作實現我們的目的呢,結合effective c++的條款中給出兩種方式,而c++11當中也給出了一種,下面由乙個例子說起,簡單介紹三種阻止拷貝的方式。

有乙個房產銷售系統類,用來描述待售房屋:

class homeforsale;
每一位房屋銷售人員都會號稱每一筆房屋資產都是天上地下獨一無二,沒有兩筆完全相像。所以我們也認為,為這個類物件做乙份副本有點沒道理——怎麼能夠複製某些先天獨一無二的東西呢?所以,homeforsale物件的拷貝動作以失敗收場:

homeforsale h1;

homeforsale h2;

homeforsale h3(h1); //此時呼叫拷貝建構函式

h1=h2; //此時呼叫拷貝賦值運算子

按照我們所想,**中的拷貝構造及賦值操作都不應該通過編譯,也就是應該阻止這樣的拷貝操作,前面已經提到過即使程式設計師自己不定義拷貝控制成員,編譯器也會自行生成預設版本。那麼應該怎樣做呢。

(1)將拷貝控制成員函式宣告為private且不進行定義

這種方式,將拷貝建構函式和拷貝賦值運算子宣告為private,阻止了編譯器建立合成版本,同時這些private函式也阻止了使用者呼叫。而不對其進行定義,也做到了即使是成員函式和友元也無法進行呼叫。

//將homeforsale的拷貝構造和拷貝賦值宣告為private且不對其定義

class homeforsale;

(2)設計乙個專門為了阻止拷貝動作的基類,將連線期錯誤轉移至編譯器

class uncopyable

~uncopyable() {}

private:

uncopyable(const uncopyable&);

uncopyable& operator=(const uncopyable)

};

為阻止homeforsale物件被拷貝,唯一需要做的就是繼承uncopyable:

class homeforsale:public uncopyable;
這種方式行得通,當嘗試拷貝homeforsale物件,編譯器就試著生成乙個拷貝建構函式和乙個拷貝賦值運算子,而這些函式的編譯器合成版會嘗試呼叫其基類的對應成員,那些呼叫會被編譯器拒絕,因為其基類的拷貝函式是private。

(3)將拷貝控制函式定義為「刪除的」

在c++11中,通過在函式的引數列表後面加上」=delete」來指出我麼希望將它定義為刪除的,即雖然宣告了它們,但不能以任何方式使用。

class

homeforsale;

析構函式不能是delete的,如果析構函式被刪除,就無法銷毀此型別的物件了。

阻止拷貝的三種方法 Cpp

當乙個物件是獨一無二的時候,為這個物件做乙個副本有點沒道理,所以我們應阻止對它進行的拷貝,但是,阻止這一動作並不是很直觀,通常來說,你不希望class的某一功能,只要不宣告對應的函式就行了,但這個策略對拷貝建構函式和賦值操作符思是無效的,因為如果你不宣告它們,編譯器會替你宣告乙個預設的,那麼該如何解...

拷貝物件的三種方式

物件拷貝又叫物件轉殖或物件複製,要求在不影響原物件及其內容的情況下,產生該物件的乙個副本並順利工作。物件轉殖一般用於把物件初始化為預設狀態。根據這幾天的觀察,共總結出三種物件拷貝的方法,下面分別介紹。在介紹之前,首先要分清淺拷貝和深拷貝之間的區別。所謂淺拷貝,是指拷貝了物件整體的引用或者物件內部某些...

java深拷貝的三種方式

問題 spring boot jpa專案中,修改某個物件以後需要生成乙個vo物件給客戶端,資料庫對應的pojo物件裡有個map型別的物件 名字叫para 這個物件的value又是個map,我使用map的putall 方法拷貝了乙份para,然後修改裡面的值,最後發現para的內容也被修改了。示例 如...