[Effective C++讀書筆記]006_條款06_若不想使用編譯器自動產生的函數,就該明確拒絕

來源:互聯網
上載者:User

序言

條款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++偷偷給你產生的函數和運算子操作。這樣的好處是:不會有未明確定義的功能流向客戶。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.