程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中通過重載避免隱式類型轉換

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

編輯:關於C++

以下是一段代碼,如果沒有什麼不尋常的原因,實在看不出什麼東西:

class UPInt { // unlimited precision
 public: // integers 類
 UPInt();
 UPInt(int value);
 ...
};
//有關為什麼返回值是const的解釋,參見Effective C++ 條款21
const UPInt operator+(const UPInt& lhs, const UPInt& rhs);
UPInt upi1, upi2;
...
UPInt upi3 = upi1 + upi2;
  這裡還看不出什麼令人驚訝的東西。upi1 和upi2都是UPInt對象,所以它們之間相加就會調用UPInts的operator函數。

現在考慮下面這些語句:

upi3 = upi1 + 10;
upi3 = 10 + upi2;
  這些語句也能夠成功運行。方法是通過建立臨時對象把整形數10轉換為UPInts(參見條款19)。

讓編譯器完成這種類型轉換是確實是很方便,但是建立臨時對象進行類型轉換工作是有開銷的,而我們不想承擔這種開銷。就象大多數人只想從政府那裡受益而不想為此付出一樣,大多數C++程序員希望進行沒有臨時對象開銷的隱式類型轉換。但是在計算領域裡發生不了赤字現象,我們如何能這麼做呢?

讓我們回退一步,認識到我們的目的不是真的要進行類型轉換,而是用UPint和int做為參數調用operator。隱式類型轉換只是用來達到目的的手段,但是我們不要混淆手段與目的。還有一種方法可以成功進行operator的混合類型調用,它將消除隱式類型轉換的需要。如果我們想要把UPInt和int對象相加,通過聲明如下幾個函數達到這個目的,每一個函數有不同的參數類型集。

const UPInt operator+(const UPInt& lhs, // add UPInt
const UPInt& rhs); // and UPInt
const UPInt operator+(const UPInt& lhs, // add UPInt
int rhs); // and int
const UPInt operator+(int lhs, // add int and
const UPInt& rhs); // UPInt
UPInt upi1, upi2;
...
UPInt upi3 = upi1 + upi2; // 正確,沒有由upi1 或 upi2
// 生成的臨時對象
upi3 = upi1 + 10; // 正確, 沒有由upi1 or 10
// 生成的臨時對象
upi3 = 10 + upi2; //正確, 沒有由10 or upi2
//生成的臨時對象。
  一旦你開始用函數重載來消除類型轉換,你就有可能這樣聲明函數,把自己陷入危險之中:

const UPInt operator+(int lhs, int rhs); // 錯誤!
  這個想法是合情合理的。對於UPInt和int類型,我們想要用所有可能的組合來重載operator函數。上面只給出了三種重載函數,唯一漏掉的是帶有兩個int參數的operator,所以我們想把它加上。

有道理麼?在C++中有一條規則是每一個重載的operator必須帶有一個用戶定義類型(user-defined type)的參數。int不是用戶定義類型,所以我們不能重載operator成為僅帶有此類型參數的函數。(如果沒有這條規則,程序員將能改變預定義的操作,這樣做肯定把程序引入混亂的境地。比如企圖重載上述的operator,將會改變int類型相加的含義。)

利用重載避免臨時對象的方法不只是用在operator函數上。比如在大多數程序中,你想允許在所有能使用string對象的地方,也一樣可以使用char*,反之亦然。同樣如果你正在使用numerical(數字)類,例如complex(參見條款35),你想讓int和double這樣的類型可以使用在numerical對象的任何地方。因此任何帶有string、char*、complex參數的函數可以采用重載方式來消除類型轉換。

不過,必須謹記80-20規則(參見條款16)。沒有必要實現大量的重載函數,除非你有理由確信程序使用重載函數以後其整體效率會有顯著的提高。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved