如果我們不想要編譯器自動(dòng)生成的 copy constructor 或者其他一些函數(shù)應(yīng)該怎么辦呢妄辩?
方法一
將 copy 構(gòu)造函數(shù)或 copy assignment 操作符聲明為private缸剪,這樣人們一般不能夠成功調(diào)用到它們仰猖。但不保證絕對(duì)安全狐赡,因?yàn)?member 函數(shù)和 friend 函數(shù)仍然可以訪問(wèn)到它們
方法二
這種方式更為精妙一些栈顷,那就是將成員函數(shù)聲明為 private
且不去實(shí)現(xiàn),這樣非法的調(diào)用就會(huì)在 linking 階段受到阻攔鸵鸥。對(duì)于 C++ 11 標(biāo)準(zhǔn)奠滑,我們還可以用 delete
關(guān)鍵字,更為簡(jiǎn)潔
方法三
如果能將 linking 階段的錯(cuò)誤提前到 compiling 階段就更好了妒穴,為此可以設(shè)計(jì)一個(gè)不允許 copy 動(dòng)作的 base class
class Uncopyable {
public:
Uncopyable(const Uncopyable &) = delete;
Uncopyable &operator=(const Uncopyable &) = delete;
protected:
Uncopyable() {}
};