青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

清風竹林

ぷ雪飄絳梅映殘紅
   ぷ花舞霜飛映蒼松
     ----- Do more,suffer less

Solmyr 的小品文系列之二:模棱兩可的陷阱

為什么會這樣?!”,zero 一邊喝水一邊嘟囔著,恨恨的看著面前顯示器上的代碼,“為什么這么簡單的一個調用也會出現編譯錯誤 …… ”

這是因為你的設計太差!”

噗!zero 被幽靈一樣出現在背后的 Solmyr 嚇了一大跳,一口水差點全噴出來。

咳!咳咳!S …… Solmyr ,你什么時候站在我背后的?”,zero 很費力的平息了咳嗽,同時努力回想剛才自己有沒有把柄會被 Solmyr 抓到。

Solmyr
抓過一張椅子坐了下來:“在你一開始干傻事的時候我就在了,正是這個糟糕的設計導致了現在困擾你的編譯錯誤。”

哪 …… 哪里?”

這兒。” Solmyr 抓過鍵盤,標出了下面這段代碼:

void SomeFunc(int i)
…………

void SomeFunc(float f)
…………

int main(void)
{
    …………
    SomeFunc(1.2);         // Error! ambiguous call
   …………
}

我 也正覺得奇怪”,zero 一如既往的撓著頭,試圖壓榨不存在的智慧,“這么簡單的一個函數重載,應該很清楚才對。我這里調用時明明給出的是浮點數,顯然應該調用 float 版本的 SomeFunc 。最奇怪的是如果沒有這個調用,整個程序編譯連接完全沒有問題,可見這樣重載函數是合法的。”

嗯,沒錯,確實是合法的,但是合法不代表正確。zero ,你念一下這一段,看看先知 Meyers 在他的《50 》(注:指《Effective C++ 2/e》一書)中的條款 26 中是怎樣描述 C++ 對待‘模棱兩可’的哲學的。”,Solmyr 翻開了一本書,指著其中的幾行。

“C++ ……”

站起來,大聲念!”

zero
依言站起,中氣十足的念道:“C++ 也有一個哲學信仰:它相信潛在的模棱兩可的狀態不是一種錯誤。”

旁邊的座位上傳來低低的竊笑聲,更遠處的人探頭張望,投來好奇的目光,zero 頓時感到自己像個傻瓜。當 zero 看到 Solmyr 嘴邊招牌式的壞笑時明白了過來:自己又一次被 Solmyr 設計了。

嗯,明白了這一點,我們就可以展開進一步的討論了”,Solmyr 開始轉入正題,“還記得上次我說過上面的 1.2 是什么嗎?”

zero
露出了回憶的表情:“嗯 …… 1.2 是‘寫在代碼里的常量’…… 應該是一個 double 類型常量。”

這就是問題所在:編譯器看到這個調用函數的請求,會去尋找你的重載函數中哪個函數能夠匹配這個調用請求給出的參數,結果它發現沒有一個函數的參數是 double 類型的,所以必須要做類型轉換,但是 double 類型既可以轉成 int ,也可以轉成 float ,究竟轉哪個好呢?編譯器不知道,所以只好報錯了。明白了嗎?”

zero
似懂非懂的點了點頭。

那我問你,這樣重載編譯時會不會報錯?”,Solmyr 稍稍改動了一下 zero 的代碼:

void SomeFunc(int i)
…………

void SomeFunc(double db)
…………

int main()
{
   …………
    float f = 1.2;
    SomeFunc(f);
    …………
}

zero
看了看,學著 Solmyr 的語氣說到:“編譯器發現沒有一個函數的參數是 float 類型的,所以必須要做類型轉換,但是 float 類型既可以轉成 int ,也可以轉成 double ,究竟轉哪個好呢?編譯器不知道,所以只好報錯了。”

錯!”,Solmyr 順手按下了運行按鈕,程序運行一切正常,輸出顯示調用的是 double 版本的 SomeFunc 函數。

zero
再度感到了困惑:“為什么同樣是要選擇類型轉換,這個就沒錯,前一個就有錯呢?這中間的邏輯何在?”

重要的是這一句:‘究竟轉哪個好呢?編譯器不知道’。你沒有注意到我說這句話的時候‘好’字上用了一個重音嗎?”

你用過重音嗎?”

“ ……
這個不是重點。重點在于,float int float double 這兩個轉換,編譯器是能夠選擇的,因為 float int 會損失數據 —— 象樣的編譯器會在做這種類型轉換的時候給出一個 warning —— float double 則不損失數據,所以編譯器知道‘轉哪個好’。而之前的情況,double int float 的轉換都要損失數據,所以編譯器不知道‘轉哪個好’,它沒辦法做一個決定 —— ”,Solmyr 看了看 zero ,再度問道,“明白了嗎?”

zero
皺著眉頭,撓頭撓的更起勁了,顯然對于消化一下子出現的這么多信息感到少許困難:“我想我明白了,關鍵是編譯器能否區分兩個類型轉換。在這里區分的關鍵是 類型轉換是否損失數據,嗯 …… 所以我只要在所有用到浮點數的場合都使用 double 類型,就不會有問題,即使別人用 float 來調用也一樣。”

正確。不過‘模棱兩可’的問題可不僅僅出現浮點數身上,例如,這樣兩個重載函數 …… ”,Solmyr 接著鍵入:

void SomeFunc(double db)
void SomeFunc(char ch)

如果我用一個整形變量來調用,會出現什么事情?”,Solmyr 扭頭盯著 zero

呃 …… 編譯器同樣無法區分 int double int char 這兩個類型轉換,所以同樣會報錯。”

正確。你能夠自己舉出幾個例子嗎?”,Solmyr 把鍵盤遞了回去。

很明顯的,zero 陷入了沉思,過了一會兒,屏幕上出現了這樣幾行代碼:

//
int 調用的話會出錯
void fun(char ch)
void fun(int* pi)            //
或者其他指針

//
int 調用同樣會出錯
void fun(double db)
void fun(int* pi)             //
或者其他指針

嗯,很好。不過你還是漏了一種重要情況,”,Solmyr 補充道,“就是參數有缺省值的時候:”

//
調用時如果不給參數會出錯
void fun(int i=10)
void fun()

天哪!”,zero 看起來快要崩潰了,“居然有這么多模棱兩可的陷阱,這叫我怎樣發布我的函數?在文檔里寫:以下 153 種調用方式將導致編譯錯誤嗎?”

不要這么緊張,”,Solmyr 好整以暇的說到,“重載函數的模棱兩可現象不是不能避免的,辦法有兩個:一是用模板來代替重載,尤其是象你的 SomeFunc 這樣 int 型和 double 型處理算法相同的情況;二是如果要用重載的話,盡可能保證函數的參數個數不同。”

可是如果處理算法不一樣,函數需要的參數個數又相同,那該怎么辦?”

很簡單,加入‘無用的參數’,象這樣:”

void SomeFunc(float db, int)
void SomeFunc(int i)

第一個函數的第二個參數沒有任何作用,所以你可以干脆不給它命名,只要聲明一下有這個 int 型參數就可以了。文檔里可以這樣寫:該參數是為今后升級預留的余地,調用時請傳入 0 值。”

“ ……
你的文檔里大概都是這一類的話吧 …… 啊!好痛!這回又是一本書!”,zero Solmyr 突如其來的襲擊擊中,發出了悲慘的哀鳴。

你得感謝先知 Scott Meyers,他的《 50 》輕而薄,我手上拿的若是一本教主 Bjarne Stroustrup 的《圣經》(注:指《The C++ Programing Language 3/e》一書,Bjarne Stroustrup C++ 語言的設計者),你現在已經爬不起來了。”,Solmyr 再度披上了修養的偽裝,不過言辭中仍然留著一點點殺氣的痕跡 ……

真是殘暴的家伙 ……”,zero 小聲嘟囔著。

你說什么?”,殺氣再度升高。

不, 不!我什么也沒說!”,zero 連忙否認,試著轉移話題,“啊!我懂了,要避免模棱兩可的陷阱,一是用模板來替代重載,二是利用加入‘無用的參數’這一手段保證重載函數參數個數不同。這 樣就可以避開模棱兩可的問題,是不是,Solmyr 老師?”。zero 很努力的裝出天真無邪的樣子。

“ ……
真是拙劣的演技 …… ”,Solmyr 心中暗想。“不完全,上述手段只能解決函數重載這一塊而已,模棱兩可問題涉及的情況要廣泛的多,比如《 50 誡》中的例子:”

class B;              //
前置聲明

class A
{
public:
    A(const B&);   // A
可以根據 B 構造出來
};

class B
{
public:
     operator A() const;    // B
可以被轉換為 A
};

這兩個類本身沒有什么問題,但若是有個函數需要 A 的對象作為參數,傳過去的卻是個 B 的對象時:”

void f(const A&)
B b;
f(b);      // Error! ambiguous call

注 意到這里面的問題了嗎?有兩種一樣好方法可以完成轉換,一是用 A 的構造函數以 b 為參數構造一個新的 A 類對象,而是調用 B 的轉換函數將 b 轉換為一個 A 類對象。編譯器再度無法區分哪個轉換更好,只能報錯了。后面還有一個多重繼承的例子,你自己看吧”

這 …… 這 ……”,zero 剛剛建立起來的對回避陷阱的自信再度崩塌。

要回避一切模棱兩可的問題是不可能的,”,Solmyr 站起身來,“關鍵是了解它為什么會發生,怎樣的情況容易誘發它,然后小心的加以處理,C++ 中很多問題都是如此。這塊《 50 誡》的石板就留給你了,好好研讀吧。哈哈哈哈!”,Solmyr 一邊笑著一邊離開了 zero ,背影看起來像是一位飄然遠去的高人 ……

什么呀!根本就只是一個性格殘暴的家伙而已,裝模做樣 …… 啪!”,zero 話音未落,一個文件夾劃破空氣飛來,正中 zero 的面門。

嗚 ~ 我什么也沒說 ~”,zero 無力的辨白,然而換來的只是旁邊的座位上再度傳來低低的竊笑聲而已。zero 明白,今天他的形象算是徹底的毀了 ……

posted on 2009-08-19 10:39 李現民 閱讀(799) 評論(1)  編輯 收藏 引用 所屬分類: 絕對盜版

評論

# re: Solmyr 的小品文系列之二:模棱兩可的陷阱 2009-09-16 13:56 egmkang.wang

寫一個T版的吧  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            黄色在线一区| 先锋影音久久| 中文在线资源观看网站视频免费不卡| 国产日韩在线一区二区三区| 免费视频最近日韩| 欧美国产在线观看| 欧美日韩国产一级片| 国产精品久久国产精麻豆99网站| 欧美午夜不卡视频| 国产日韩1区| 在线成人欧美| 亚洲人人精品| 亚洲嫩草精品久久| 久久久精品欧美丰满| 欧美激情按摩在线| 亚洲狼人综合| 欧美一区二区三区四区视频| 久久综合久色欧美综合狠狠| 欧美日韩视频一区二区三区| 国产亚洲精品成人av久久ww| 亚洲精品孕妇| 久久久久综合网| 亚洲国产精品va| 最近中文字幕mv在线一区二区三区四区| 日韩一二三区视频| 久久国产精品亚洲va麻豆| 欧美精选午夜久久久乱码6080| 国产日韩精品视频一区二区三区| 亚洲精品久久| 老鸭窝亚洲一区二区三区| 夜夜嗨av一区二区三区四区 | 国内精品久久久久久久97牛牛| 亚洲国产精品成人精品| 亚洲一区二区不卡免费| 蜜臀av一级做a爰片久久| 一区二区欧美国产| 美女爽到呻吟久久久久| 国产一二精品视频| 亚洲一区在线观看免费观看电影高清 | 午夜精彩视频在线观看不卡 | 樱花yy私人影院亚洲| 亚洲欧美第一页| 最新中文字幕一区二区三区| 久久精品国产一区二区三区免费看 | 91久久综合| 欧美激情第三页| 欧美日韩三区| 99国产麻豆精品| 美女精品国产| 久久国产精品一区二区三区四区| 欧美日韩色综合| 日韩一级视频免费观看在线| 免费不卡亚洲欧美| 欧美中在线观看| 国产视频在线一区二区| 亚洲一区欧美二区| 夜夜嗨av一区二区三区四季av | 欧美在线播放一区二区| 亚洲先锋成人| 国产精品久99| 欧美在线免费一级片| 亚洲一区二区三区乱码aⅴ| 欧美亚韩一区| 欧美一区二区在线播放| 性欧美办公室18xxxxhd| 红桃视频亚洲| 亚洲丁香婷深爱综合| 麻豆成人av| 亚洲靠逼com| 亚洲精品在线电影| 欧美午夜无遮挡| 欧美专区在线观看一区| 久久久精品欧美丰满| 亚洲国产婷婷香蕉久久久久久| 欧美承认网站| 欧美三级欧美一级| 欧美综合国产| 久久久水蜜桃| 99成人在线| 日韩一二三在线视频播| 国产精品亚洲综合一区在线观看| 久久精品天堂| 美女黄色成人网| 亚洲视频www| 欧美影视一区| 亚洲伦伦在线| 亚洲欧美日韩国产综合精品二区 | 亚洲人永久免费| 日韩午夜剧场| 国产色视频一区| 欧美高清在线| 国产精品九九久久久久久久| 久久亚洲国产精品一区二区 | 欧美激情一区在线| 午夜日韩电影| 欧美成人精品h版在线观看| 亚洲一区二区影院| 久久香蕉精品| 午夜精品久久久久99热蜜桃导演| 欧美一区二区三区日韩| 亚洲免费观看高清在线观看| 欧美日韩一区二区视频在线| 亚洲看片一区| 国产日韩在线一区| 亚洲精品久久久久久久久久久久 | 亚洲网站在线| 久久久精品国产免大香伊| 一区二区三区四区国产精品| 久久精品99| 亚洲欧美视频在线| 欧美精品v国产精品v日韩精品| 欧美一区二区女人| 欧美高清hd18日本| 久久精品成人一区二区三区| 欧美理论在线播放| 男男成人高潮片免费网站| 国产精品久久看| 亚洲精品美女| 最新日韩欧美| 久久婷婷色综合| 久久久久国产精品午夜一区| 欧美视频观看一区| 亚洲人体大胆视频| 亚洲欧洲一区二区三区久久| 久久精品一级爱片| 欧美在线观看视频一区二区三区| 欧美日韩精品免费观看| 亚洲高清中文字幕| 91久久久久久| 久久综合久久久久88| 美日韩丰满少妇在线观看| 国产视频亚洲精品| 亚洲欧美日韩久久精品| 亚洲欧美中文另类| 国产精品扒开腿爽爽爽视频| 亚洲美女视频| 亚洲素人在线| 国产精品igao视频网网址不卡日韩| 亚洲国产日韩欧美在线99| 最新亚洲一区| 欧美日韩免费| 中文一区字幕| 欧美在线视频一区| 国产综合自拍| 另类亚洲自拍| 最近看过的日韩成人| 亚洲午夜久久久| 国产精品视频精品| 久久国产精品一区二区| 免费看亚洲片| 在线亚洲成人| 国产精品日韩欧美一区| 性久久久久久久久久久久| 久久精品一区中文字幕| 在线观看精品一区| 欧美精品v日韩精品v国产精品| 日韩视频在线免费| 欧美一区2区三区4区公司二百| 国产欧美一区二区三区国产幕精品| 久久成人免费日本黄色| 亚洲成人在线视频播放 | 亚洲国语精品自产拍在线观看| 亚洲国产成人高清精品| 男人插女人欧美| 日韩亚洲欧美成人| 久久国产天堂福利天堂| 亚洲国产精品欧美一二99| 欧美日本在线一区| 香蕉成人久久| 亚洲青色在线| 久久狠狠久久综合桃花| 亚洲欧洲一区二区在线播放| 国产精品成人aaaaa网站 | 久久久久久久尹人综合网亚洲| 欧美成人首页| 午夜精品视频| 亚洲精品资源| 国产一区二区你懂的| 欧美黑人国产人伦爽爽爽| 亚洲影音一区| 亚洲日本成人女熟在线观看| 欧美在线视频观看免费网站| 亚洲欧洲日韩女同| 国产一区视频在线观看免费| 欧美伦理一区二区| 久久久精品一区| 亚洲一区二区三区免费视频| 欧美成人国产一区二区| 欧美有码在线视频| 亚洲无亚洲人成网站77777| 亚洲激情综合| 激情成人中文字幕| 国产精品久久久久婷婷| 欧美女激情福利| 老司机免费视频一区二区三区| 亚洲综合日韩| 国产精品99久久久久久久女警| 亚洲国产成人tv| 久久综合九色综合欧美就去吻 | 欧美成人免费全部|