程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> More Effective C++:不要重載的操作符

More Effective C++:不要重載的操作符

編輯:關於C++

與C一樣,C++使用布爾表達式簡化求值法(short-circuit evaluation)。這表示一旦確定了布爾表達式的真假值,即使還有部分表達式沒有被測試,布爾表達式也停止運算。例如:

char *p;
...
if ((p != 0) && (strlen(p) > 10)) ...

這裡不用擔心當p為空時strlen無法正確運行,因為如果p不等於0的測試失敗,strlen不會被調用。同樣:

int rangeCheck(int index)
{
 if ((index < lowerBound) || (index > upperBound)) ...
  ...
}

如果index小於lowerBound,它不會與upperBound進行比較。

很早以前上述行為特性就被反復灌輸給C和C++的程序員,所以他們都知道該特性。而且他們也依賴於簡短求值法來寫程序。例如在上述第一個代碼中,當p為空指針時確保strlen不會被調用是很重要的,因為C++標准說(正如C標准所說)用空指針調用strlen,結果不確定。

C++允許根據用戶定義的類型,來定制&&和||操作符。方法是重載函數operator&& 和operator||,你能在全局重載或每個類裡重載。然而如果你想使用這種方法,你必須知道你正在極大地改變游戲規則。因為你以函數調用法替代了簡短計算法。也就是說如果你重載了操作符&&,對於你來說代碼是這樣的:

if (expression1 && expression2) ...

對於編譯器來說,等同於下面代碼之一:

if (expression1.operator&&(expression2)) ...
// when operator&& is a
// member function
if (operator&&(expression1, expression2)) ...
// when operator&& is a
// global function

這好像沒有什麼不同,但是函數調用法與簡短求值法是絕對不同的。首先當函數被調用時,需要運算其所有參數,所以調用函數functions operator&& 和 operator||時,兩個參數都需要計算,換言之,沒有采用簡短計算法。第二是C++語言規范沒有定義函數參數的計算順序,所以沒有辦法知道表達式1與表達式2哪一個先計算。完全與具有從左參數到右參數計算順序的簡短計算法相反。

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