序言
條款06:若不想使用編譯器自動產生的函數,就應該明確拒絕
關於本條款,本人認為這樣做的目的只有一點:
意圖:阻止你沒有明確定義的功能流向客戶
手段:屏蔽C++偷偷為你的類提供的功能
比如“=”運算子是C++默默產生的,但是或許你根本不希望你的類可以這樣賦值。比如預設建構函式,或許你根本不希望使用者那樣構造你的對象。
實現手段
要屏蔽C++偷偷為你提供的函數和運算子操作,可以有很多方法。但是作者提供的方法,我也覺得是最好的方法,是怎樣好的呢?我們來看程式碼範例吧!
1 #include <iostream> 2 using namespace std; 3 4 class UnCopyable{ 5 protected: 6 UnCopyable(){} 7 ~UnCopyable(){} 8 private: 9 UnCopyable(const UnCopyable&); // 利用存取權限private解決屏蔽預設建構函式問題10 UnCopyable& operator=(const UnCopyable&); // 利用存取權限private解決螢幕“=”運算子問題11 };12 13 class MyClass : public UnCopyable{14 public:15 void test(){ cout<<"MyClass"<<endl; }16 };17 18 int main(){19 MyClass mc1;20 MyClass mc2;21 22 mc1 = mc2; // Error: “UnCopyable::operator =”: 無法訪問 private 成員(在“UnCopyable”類中聲明)23 MyClass mc3(mc1); // Error: “UnCopyable::UnCopyable”: 無法訪問 private 成員(在“UnCopyable”類中聲明)24 25 system("pause");26 return 0;27 }
上面著色的部分就是作者給出的解決方案,不得不說,這一招的確比較好用。
總結
如果你想完全控制你的類,就需要屏蔽掉C++偷偷給你產生的函數和運算子操作。這樣的好處是:不會有未明確定義的功能流向客戶。