• <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>
            隨筆-4  評(píng)論-40  文章-117  trackbacks-0

            在C和C + +中,如果編譯器看到一個(gè)表達(dá)式或函數(shù)調(diào)用使用了一個(gè)不合適的類型,它經(jīng)常
            會(huì)執(zhí)行一個(gè)自動(dòng)類型轉(zhuǎn)換。在C + +中,可以通過(guò)定義自動(dòng)類型轉(zhuǎn)換函數(shù)來(lái)為用戶定義類型達(dá)到
            相同效果。這些函數(shù)有兩種類型:特殊類型的構(gòu)造函數(shù)和重載的運(yùn)算符。
            11.6.1 構(gòu)造函數(shù)轉(zhuǎn)換
            如果我們定義一個(gè)構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)能把另一類型對(duì)象(或引用)作為它的單個(gè)參
            數(shù),那么這個(gè)構(gòu)造函數(shù)允許編譯器執(zhí)行自動(dòng)類型轉(zhuǎn)換。如下例:

            class One{
             public:
            One(){}
            };

            class Two{
            public:
            Two(const One&){}
            };

            void f(Two t){
            }

            main(){
            One one;
            f(one);      //Wants a Two, has a One
            }

            當(dāng)編譯器看到f( )以為對(duì)象o n e參數(shù)調(diào)用時(shí),編譯器檢查f( )的聲明并注意到它需要一個(gè)t w o
            對(duì)象作為參數(shù)。然后,編譯器檢查是否有從對(duì)象one 到t w o的方法。它發(fā)現(xiàn)了構(gòu)造函數(shù)
            t w o : : t w o ( o n e ),t w o : : t w o ( o n e )被悄悄地調(diào)用,結(jié)果對(duì)象t w o被傳遞給f( )。
            在這個(gè)情況里,自動(dòng)類型轉(zhuǎn)換避免了定義兩個(gè)f( )重載版本的麻煩。然而,代價(jià)是隱藏了
            構(gòu)造函數(shù)對(duì)t w o的調(diào)用,如果我們關(guān)心f( )的調(diào)用效率的話,那就不要使用這種方法。
            • 阻止構(gòu)造函數(shù)轉(zhuǎn)換
            有時(shí)通過(guò)構(gòu)造函數(shù)自動(dòng)轉(zhuǎn)換類型可能出現(xiàn)問(wèn)題。為了避開(kāi)這個(gè)麻煩,可以通過(guò)在前面加關(guān)
            鍵字explicit (只能用于構(gòu)造函數(shù))來(lái)修改構(gòu)造函數(shù)。上例類t w o的構(gòu)造函數(shù)作了修改,如下:

            class One{
             public:
            One(){}
            };

            class Two{
            public:
            Two(const One&){}
            };

            void f(Two t){
            }

            main(){
            One one;
            //f(one);      //no auto conversion allowed
            f(Two(one));      //OK user perform conversion
            }


            通過(guò)使類t w o的構(gòu)造函數(shù)顯式化,編譯器被告知不能使用那個(gè)構(gòu)造函數(shù)(那個(gè)類中其他非
            顯式化的構(gòu)造函數(shù)仍可以執(zhí)行自動(dòng)類型轉(zhuǎn)換)執(zhí)行任何自動(dòng)轉(zhuǎn)換。如果用戶想進(jìn)行轉(zhuǎn)換必須寫(xiě)
            出代碼。上面代碼f ( t w o ( O n e ) )創(chuàng)建一個(gè)從類型O n e到t w o的臨時(shí)對(duì)象,就像編譯器在前面版本中
            做的那樣。



            11.6.2 運(yùn)算符轉(zhuǎn)換
            第二種自動(dòng)類型轉(zhuǎn)換的方法是通過(guò)運(yùn)算符重載。我們可以創(chuàng)建一個(gè)成員函數(shù),這個(gè)函數(shù)通
            過(guò)在關(guān)鍵字o p e r a t o r后跟隨想要轉(zhuǎn)換到的類型的方法,將當(dāng)前類型轉(zhuǎn)換為希望的類型。這種形
            式的運(yùn)算符重載是獨(dú)特的,因?yàn)闆](méi)有指定一個(gè)返回類型——返回類型就是我們正在重載的運(yùn)算
            符的名字。這兒有一個(gè)例子:

            class Three{
            int i;
            public:
            Three(int I = 0, int = 0) : i(I){}
            };

            class Four{
            int x;
            public:
            Four(int X) : x(X){}
            operator Three(){ return Three(x); }
            };

            void g(three){}

            void main(){
            Four four(1);
            g(four);
            g(1);
            }


            用構(gòu)造函數(shù)技術(shù),目的類執(zhí)行轉(zhuǎn)換。然而使用運(yùn)算符技術(shù),是源類執(zhí)行轉(zhuǎn)換。構(gòu)造函數(shù)技
            術(shù)的價(jià)值是在創(chuàng)建一個(gè)新類時(shí)為現(xiàn)有系統(tǒng)增加了新的轉(zhuǎn)換途徑。然而,創(chuàng)建一個(gè)單一參數(shù)的構(gòu)
            造函數(shù)總是定義一個(gè)自動(dòng)類型轉(zhuǎn)換(即使它有不止一個(gè)參數(shù)也是一樣,因?yàn)槠溆嗟膮?shù)將被缺
            省處理),這可能并不是我們所想要的。另外,使用構(gòu)造函數(shù)技術(shù)沒(méi)有辦法實(shí)現(xiàn)從用戶定義類
            型向內(nèi)置類型轉(zhuǎn)換,這只有運(yùn)算符重載可能做到。



            posted on 2009-03-06 19:07 李陽(yáng) 閱讀(1239) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
            久久精品国产亚洲精品| 狠狠色丁香婷婷综合久久来| 亚洲精品国产综合久久一线| 少妇精品久久久一区二区三区 | 精品久久久久久久无码 | 久久国产成人精品麻豆| 久久久久久久国产免费看| 麻豆亚洲AV永久无码精品久久| 99久久成人18免费网站| 午夜天堂精品久久久久| 久久精品国产亚洲av瑜伽| www.久久热.com| 天天爽天天狠久久久综合麻豆 | 人妻少妇久久中文字幕一区二区| 99国内精品久久久久久久| 久久亚洲欧美国产精品| 亚洲国产精品无码久久青草| 青青草国产成人久久91网| 日韩av无码久久精品免费| 狠狠综合久久AV一区二区三区| 久久久久久久国产免费看| 久久久精品久久久久久| 99久久精品这里只有精品| 久久成人国产精品| 人妻无码久久一区二区三区免费 | 国产精品久久婷婷六月丁香| 久久av免费天堂小草播放| 91性高湖久久久久| 18岁日韩内射颜射午夜久久成人| 99国产精品久久久久久久成人热| 亚洲精品乱码久久久久久按摩| 一本色道久久综合| 国产成人精品三上悠亚久久| 亚洲国产另类久久久精品| 亚洲中文久久精品无码ww16| 少妇高潮惨叫久久久久久| 久久精品国产亚洲AV无码偷窥| 好久久免费视频高清| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产精品成人99久久久久| 久久精品二区|