通過重載避免隱式類型轉換
知識
08-01
如下一段代碼,沒比較尋常的:
- class UPInt
- {
- public:
- UPInt();
- UPInt(int value);
- ...
- };
- const UPInt operator+(const UPInt* lhs,const UPInt* rhs);
- UPInt upi1,upi2;
- ...
- UPInt upi3 = upi1 +upi2;
現在考慮如下代碼:
- upi3 = upi1 + 10;
- upi3 = 10 + upi1;
這些語句也能運行成功,方法是通過建立臨時對象把整型10轉換成UPInt。經歷這種轉換會帶來開銷,我們可以避免這種開銷,即將函數聲明出來:如果我們想把UPInt和int對象相加,通過聲明函數來達到目的:
- const UPInt operator+(const UPInt* lhs,const UPInt* rhs);//UPInt相加
- const UPInt operator+(const UPInt* lhs,int rhs); //UPInt和int相加
- const UPInt operator+(int lhs,const UPInt* rhs); //int和UPInt相加
- UPInt upi1,upi2;
- ...
- UPInt upi3 = upi1 +upi2; //UPInt相加
- upi3 = upi1 + 10; //不會生成臨時對象
- 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:程序員小新人學習 |