【06】若不想使用編譯器自動生成的函式,就該明確拒絕

Andy Niu發表於2014-01-15

1、有些情況下,我們不希望物件被拷貝,比如獨一無二的物件,拷貝是沒有意義的。這種情況下,我們應該禁止拷貝。也就是不提供copy構造和copy賦值,可問題是,如果我們不提供,編譯器會自動生成。那該怎麼辦?

2、我們宣告copy構造和copy賦值為private,這就明確告訴了編譯器,我已經宣告瞭,你別為我生成了。由於copy構造和copy賦值是private,就禁止了外部的拷貝操作。

  但仔細想,還是有問題,因為類的成員方法,友元方法,友元類還是可以訪問private許可權的copy構造和copy賦值,那該怎麼辦?

  只宣告,不定義。這樣,就導致編譯器連線的時候出錯。有沒有更好的辦法呢?也就是說,將連線時錯誤移到編譯時錯誤,在編譯時就報錯。畢竟,越早發現錯誤就越好。

  編譯器自動生成的方法,只有在需要的時候才自動生成,也就是被呼叫的時候,才自動生成。另外,編譯器自動生成的方法,還有一個特點,為了保證父類的成分被初始化和賦值,自動生成的copy構造和copy賦值,會呼叫父類的對應方法。如果我將父類的copy構造和copy賦值宣告為private,編譯器為子類自動生成的copy構造和copy賦值,沒法呼叫父類對應的方法,編譯出錯。

  在需要的時候,編譯器才自動生成。如果程式碼中,沒有copy構造和copy賦值,編譯器不會試圖去生成copy構造和copy賦值,就沒問題了。

3、為了讓copy構造和copy賦值在編譯時報錯,需要一個父類。boost庫中,提供了一個類noncopyable,繼承它就可以了。

相關文章