在面向對象的世界中,有一些對象是需要保持獨一無二的,如設計一個“公民”的類,每個公民都是唯一的,有唯一的身份證號與其對應。任何對該對象的複製都是毫無意義的,需要在類的設計上被徹底禁止掉。
普通的C++菜鳥會說,那我在類的設計裏,不去實現拷貝構造和賦值操作不就完了嗎?其實不行!C++會在背後偷偷的幫你現實一個默認的拷貝構造的版本,我們必須將這個後門給堵死。
禁止掉這些複製的操作,可以將複製相關的操作設置爲私有的,這樣外界就無法對其複製了。
來看看下面的版本一:
class CPeople
{
// ...
private:
// 將複製相關的操作定義爲私有
CPeople(){...};
const CPeople& operator=(const CPeople& rhis){...}
};
這樣的設計,可以部分的禁止的類的複製,但是對於友元函數和類成員函數來說,還是可以調用其相關的複製操作的。那如何將這最後的兩類函數也對其禁止複製呢?來看看下面的版本二:
class CPeople
{
// ...
private:
// 將複製相關的操作定義爲私有
CPeople(); // 只聲明不實現
const CPeople& operator=(const CPeople& rhis); // 只聲明不實現
};
這種做法,纔是真正的實現了對象的禁止拷貝。
另外,你也可以繼承BOOST庫中的boost::noncopable類來實現對象的拷貝禁止功能。