當前位置:
首頁 > 知識 > 通過重載避免隱式類型轉換

通過重載避免隱式類型轉換

如下一段代碼,沒比較尋常的:

  1. class UPInt
  2. {
  3. public:
  4. UPInt();
  5. UPInt(int value);
  6. ...
  7. };
  8. const UPInt operator+(const UPInt* lhs,const UPInt* rhs);
  9. UPInt upi1,upi2;
  10. ...
  11. UPInt upi3 = upi1 +upi2;

現在考慮如下代碼:

  1. upi3 = upi1 + 10;
  2. upi3 = 10 + upi1;

這些語句也能運行成功,方法是通過建立臨時對象把整型10轉換成UPInt。經歷這種轉換會帶來開銷,我們可以避免這種開銷,即將函數聲明出來:如果我們想把UPInt和int對象相加,通過聲明函數來達到目的:

  1. const UPInt operator+(const UPInt* lhs,const UPInt* rhs);//UPInt相加
  2. const UPInt operator+(const UPInt* lhs,int rhs); //UPInt和int相加
  3. const UPInt operator+(int lhs,const UPInt* rhs); //int和UPInt相加
  4. UPInt upi1,upi2;
  5. ...
  6. UPInt upi3 = upi1 +upi2; //UPInt相加
  7. upi3 = upi1 + 10; //不會生成臨時對象
  8. upi3 = 10 + upi1; //不會生成臨時對象

一旦你開始用函數重載來消除類型轉換,你就有可能聲明這樣的函數,把自己置於危險之中:

const UPInt operator+(int lhs,int rhs);

C++規定:每一個重載的operator必須帶有一個用戶自定義類型。int不是用戶自定義類型,所以我們不能重載operator僅僅只有int參數的函數。

利用重載避免臨時對象的方法不止是用於operator函數上。比如大多數程序中,你想允許所有能使用string的地方,也一樣能使用char*,反之亦然。同樣如果你正在使用numerial(數字)類,例如complex,你想讓int和double可以使用numerial的地方。

因此任何帶有string、char*、complex參數的函數都可以採用重載方式來消除類型轉換。

牢記80-20法則,沒有必要實現大量的重載函數,除非你又理由確信程序使用重載函數以後整體的效率會顯著提高。

通過重載避免隱式類型轉換

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

全球近1/5的比特幣已經永久丟失!三種方法讓你找回丟失的比特幣
在Linux上增加swap空間的技巧

TAG:程序員小新人學習 |