為何編譯器無法自動生成拷貝函式

2021-07-05 17:24:32 字數 576 閱讀 9800

c++編譯器一般會為使用者自定義型別生成預設拷貝函式。它的行為是逐位複製。逐位複製的意思不是memcpy,而是逐個變數進行複製。

很多書有教導如何禁用掉編譯器的拷貝函式:自己宣告乙個private的拷貝函式。

不過有些時候我們沒有故意禁用拷貝函式,卻發現編譯錯誤:提示沒有相應拷貝函式。這是為什麼呢?(一般發生在使用std容器時)

1)先瞄下,有沒有不小心宣告了個private的拷貝函式

2)逐個檢查類的非靜態變數,保證都是可以複製的。注意:指標都是可以複製的,引用都是不可複製的,const變數也不可複製!

class foo1 //不可複製,因為boost::mutex不可複製 ;

class foo2 //可複製,因為指標都是可複製的 ;

class foo3 //不可複製,因為引用不可複製 ;

class foo4 //不可複製,因為const物件不可複製

; 相應的就知道了如何把乙個不可複製的物件轉成可以複製的,這一般是為了在std容器裡面使用嘿。不過很多時候轉換比較麻煩(比如我就是想用mutex),這時可以考慮在容器內放智慧型指標或指標,如boost::shared_ptr和foo1*。

C 編譯器自動生成拷貝建構函式的情況

編譯器在下面幾種情況下會給程式設計師沒有提供拷貝建構函式的類自動生成拷貝建構函式 1.類中有虛函式 當這個類中有虛函式的時候,意味著這個類的物件中一定包含了指向其虛函式表的指標 試想,如果講該類的派生類的物件作為該類的初始化物件,即 b繼承a class a private int m a publ...

拒絕編譯器自動生成的函式

編譯器自動的函式 有些場景中需要拒絕這些編譯器自動生成的函式,可以通過下列方法,定義uncopyable類並繼承它。拒絕使用編譯器生成的函式 class uncopyable uncopyable private 拒絕copy uncopyable const uncopyable 在這裡宣告,不用...

編譯器自動生成預設建構函式的情況

在程式設計師沒有為類定義預設建構函式的情況下,c 編譯器在某些情況下會自動生成預設建構函式。1.類中包含的其他有預設建構函式的類的物件 例如 class a private int data public a a a this data 10 class b private a m a int m ...