亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

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

  與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哪一個先計算。完全與具有從左參數到右參數計算順序的簡短計算法相反。

  因此假如你重載&&或,就沒有辦法提供給程序員他們所期望和使用的行為特性,所以不要重載&&和。

  同樣的理由也適用于括號操作符,但是在我們深入研究它之前,我還是暫停一下,讓你不要太驚奇,“逗號操作符?哪有逗號操作符?”確實存在。

  逗號操作符用于組成表達式,你經常在for循環的更新部分(update part)里遇見它。例如下面來源于Kernighan's and Ritchie's 經典書籍The C Programming Language 第二版(Prentice-Hall, 1988)的函數:

// reverse string s in place

void reverse(char s[])
{
 for (int i = 0, j = strlen(s)-1;i < j;++i, --j) // 啊! 逗號操作符!
 {
  int c = s[i];
  s[i] = s[j];
  s[j] = c;
 }
}
  在for循環的最后一個部分里,i被增加同時j被減少。在這里使用逗號很方便,因為在最后一個部分里只能使用一個表達式,分開表達式來改變i和j的值是不合法的。

  對于內建類型&&和,C++有一些規則來定義它們如何運算。與此相同,也有規則來定義逗號操作符的計算方法。一個包含逗號的表達式首先計算逗號左邊的表達式,然后計算逗號右邊的表達式;整個表達式的結果是逗號右邊表達式的值。所以在上述循環的最后部分里,編譯器首先計算++i,然后是—j,逗號表達式的結果是--j。

  也許你想為什么你需要知道這些內容呢?因為你需要模擬這個行為特性,假如你想大膽地寫自己的逗號操作符函數。不幸的是你無法模擬。

  假如你寫一個非成員函數operator,你不能保證左邊的表達式先于右邊的表達式計算,因為函數(operator)調用時兩個表達式做為參數被傳遞出去。但是你不能控制函數參數的計算順序。所以非成員函數的方法絕對不行。

  剩下的只有寫成員函數operator的可能性了。即使這里你也不能依靠于逗號左邊表達式先被計算的行為特性,因為編譯器不一定必須按此方法去計算。因此你不能重載逗號操作符,保證它的行為特性與其被料想的一樣。重載它是完全輕率的行為。

  你可能正在想這個重載惡夢究竟有沒有完。究竟假如你能重載逗號操作符,你還有什么不能重載的呢?正如顯示的,存在一些限制,你不能重載下面的操作符:

. .* :: ?:

new delete sizeof typeid

static_cast dynamic_cast const_cast reinterpret_cast
  你能重載:

operator new operator delete

operator new[] operator delete[]

+ - * / % ^ & ~

! = < > += -= *= /= %=

^= &= = << >> >>= <<= == !=

<= >= && ++ -- , ->* ->

() []
  當然能重載這些操作符不是去重載的理由。操作符重載的目的是使程序更輕易閱讀,書寫和理解,而不是用你的知識去迷惑其他人。假如你沒有一個好理由重載操作符,就不要重載。在碰到&&, , 和 ,時,找到一個好理由是困難的,因為無論你怎么努力,也不能讓它們的行為特性與所期望的一樣。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲风情亚aⅴ在线发布| 欧美天天综合色影久久精品| 午夜欧美大片免费观看| 欧美在线视频免费| 亚洲精美色品网站| 亚洲精品久久久久中文字幕二区| 九九九久久国产免费| 91精品国产综合久久久久久蜜臀| 亚洲欧洲日产国产网站| 岛国精品视频在线播放| 精品国产网站地址| 成人午夜一级二级三级| 国产精品欧美亚洲777777| 欧洲亚洲免费视频| 国产在线拍揄自揄视频不卡99| 欧美性理论片在线观看片免费| 日韩av中文字幕在线播放| 亚洲欧美日韩视频一区| 精品美女久久久久久免费| 日韩视频免费大全中文字幕| 91av在线免费观看| 日韩av电影在线播放| 欧美专区福利在线| 亚洲欧美综合另类中字| 狠狠色狠狠色综合日日小说| 在线观看国产精品91| 亚洲欧美在线看| 川上优av一区二区线观看| 欲色天天网综合久久| 国产亚洲精品久久久久久| 国产精品视频公开费视频| 国产脚交av在线一区二区| 人人爽久久涩噜噜噜网站| 亚洲国产欧美一区| 欧美激情亚洲激情| 国产精品久久视频| 国产精品综合不卡av| 日韩中文字幕久久| 国产精品福利在线观看网址| 在线观看精品国产视频| 久久精品国产96久久久香蕉| 插插插亚洲综合网| 久久精品视频在线观看| 精品国产91乱高清在线观看| 国产欧美亚洲视频| 日本伊人精品一区二区三区介绍| 欧美国产在线电影| 亚洲国产精品99| 久久久久久综合网天天| 国产成人亚洲综合青青| 欧美一级片一区| 欧美大成色www永久网站婷| 日韩av在线免费播放| 高清欧美性猛交xxxx黑人猛交| 红桃av永久久久| 成人免费视频在线观看超级碰| 日韩欧美极品在线观看| 久久久久久久亚洲精品| 亚洲女人天堂网| 92看片淫黄大片欧美看国产片| 国产成人精彩在线视频九色| 色偷偷噜噜噜亚洲男人| 国产精品一区二区久久精品| 日韩视频免费大全中文字幕| 2021国产精品视频| 亚洲一区二区三区在线视频| 亚洲一区二区中文字幕| 国产精品美女免费视频| 日本人成精品视频在线| 亚洲精选中文字幕| 国产精品免费一区二区三区都可以| 国产精品视频播放| 精品国产老师黑色丝袜高跟鞋| 55夜色66夜色国产精品视频| 国产精品日韩精品| 国产精品91免费在线| 综合136福利视频在线| 亚洲国产天堂久久综合| 一本色道久久88亚洲综合88| 国产成人精品电影久久久| 欧美疯狂做受xxxx高潮| 色偷偷888欧美精品久久久| 亚洲人成人99网站| 亚洲最大福利视频| 美女久久久久久久| 精品久久中文字幕久久av| 亚洲曰本av电影| 久久久亚洲网站| 日韩精品在线影院| 久久精品免费播放| 一区二区三区视频免费在线观看| 欧美理论电影网| 久久精品这里热有精品| 欧美午夜激情小视频| 91精品一区二区| 欧美视频中文字幕在线| 久久精品久久久久电影| 欧美成人午夜激情在线| 成人性教育视频在线观看| 久久久亚洲影院你懂的| 一区二区国产精品视频| 日韩欧美在线一区| 日韩中文字幕免费视频| 日韩欧美中文字幕在线播放| 久久久久久久久久久免费精品| 欧美激情a∨在线视频播放| 日韩av网址在线| 久久精品国产91精品亚洲| 国产精品一区二区三区在线播放| 国产在线视频91| 黑人巨大精品欧美一区二区一视频| 精品视频在线观看日韩| 韩国福利视频一区| 亚洲韩国青草视频| 日韩成人在线视频| 38少妇精品导航| 美女久久久久久久久久久| 一区二区av在线| 久久综合色88| 久久免费少妇高潮久久精品99| 欧美激情视频网址| 国产精品久久久久久久久久东京| 国产精品观看在线亚洲人成网| 精品毛片网大全| 国语自产精品视频在线看一大j8| 中文国产亚洲喷潮| 国产手机视频精品| 最近免费中文字幕视频2019| 国产视频一区在线| 97国产精品视频人人做人人爱| 日韩精品中文字幕在线播放| 欧美极品少妇全裸体| 免费不卡在线观看av| 国产日产亚洲精品| 一区二区三区四区在线观看视频| 欧美视频二区36p| 91久久精品在线| 国产性猛交xxxx免费看久久| 国产一区二区三区网站| 欧美香蕉大胸在线视频观看| 精品一区二区亚洲| 亚洲人成电影在线播放| 91精品久久久久久久久久久久久久| 国产aaa精品| 国产性猛交xxxx免费看久久| 色阁综合伊人av| 欧美成年人视频| 久久影院在线观看| 成人激情av在线| 亚洲欧美制服第一页| 在线日韩中文字幕| 大伊人狠狠躁夜夜躁av一区| 深夜福利亚洲导航| www.美女亚洲精品| 日韩欧美有码在线| 精品国模在线视频| 国产精品一区二区女厕厕| 欧美大片免费观看| 国产精品久久91| 久久免费视频在线观看| 欧美一区二区三区免费视| 91av成人在线| 国产ts人妖一区二区三区| 亚洲裸体xxxx|