国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 05:48:27
字體:
來源:轉載
供稿:網友

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

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)。沒有必要實現大量的重載函數,除非你有理由確信程序使用重載函數以后其整體效率會有顯著的提高。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新野县| 长岭县| 卓资县| 扶余县| 绍兴县| 江安县| 滨州市| 芦溪县| 台中市| 万年县| 麟游县| 太湖县| 潼关县| 东源县| 泸州市| 施甸县| 福泉市| 平远县| 琼中| 察雅县| 福鼎市| 罗平县| 大新县| 海淀区| 西贡区| 伊川县| 遂平县| 大方县| 邓州市| 临高县| 平阴县| 元阳县| 城口县| 广南县| 遂平县| 常宁市| 汝城县| 改则县| 阳曲县| 英德市| 德钦县|