• <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  評論-40  文章-117  trackbacks-0

            在C和C + +中,如果編譯器看到一個表達式或函數調用使用了一個不合適的類型,它經常
            會執行一個自動類型轉換。在C + +中,可以通過定義自動類型轉換函數來為用戶定義類型達到
            相同效果。這些函數有兩種類型:特殊類型的構造函數和重載的運算符。
            11.6.1 構造函數轉換
            如果我們定義一個構造函數,這個構造函數能把另一類型對象(或引用)作為它的單個參
            數,那么這個構造函數允許編譯器執行自動類型轉換。如下例:

            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
            }

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

            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
            }


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



            11.6.2 運算符轉換
            第二種自動類型轉換的方法是通過運算符重載。我們可以創建一個成員函數,這個函數通
            過在關鍵字o p e r a t o r后跟隨想要轉換到的類型的方法,將當前類型轉換為希望的類型。這種形
            式的運算符重載是獨特的,因為沒有指定一個返回類型——返回類型就是我們正在重載的運算
            符的名字。這兒有一個例子:

            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);
            }


            用構造函數技術,目的類執行轉換。然而使用運算符技術,是源類執行轉換。構造函數技
            術的價值是在創建一個新類時為現有系統增加了新的轉換途徑。然而,創建一個單一參數的構
            造函數總是定義一個自動類型轉換(即使它有不止一個參數也是一樣,因為其余的參數將被缺
            省處理),這可能并不是我們所想要的。另外,使用構造函數技術沒有辦法實現從用戶定義類
            型向內置類型轉換,這只有運算符重載可能做到。



            posted on 2009-03-06 19:07 李陽 閱讀(1239) 評論(0)  編輯 收藏 引用 所屬分類: C++
            99久久99久久精品国产片果冻| jizzjizz国产精品久久| 欧美亚洲国产精品久久蜜芽| 精品精品国产自在久久高清| 久久久久国产精品三级网 | 婷婷久久综合| 精品久久无码中文字幕| 久久亚洲2019中文字幕| 中文字幕久久欲求不满| 久久精品中文无码资源站| 热99RE久久精品这里都是精品免费 | 中文字幕乱码久久午夜| 国产精品日韩深夜福利久久 | 精品免费久久久久国产一区| 亚洲色欲久久久久综合网| 国产成人综合久久久久久| .精品久久久麻豆国产精品| 国产成人久久精品一区二区三区 | 国内精品伊人久久久久777| 欧美久久亚洲精品| 久久精品aⅴ无码中文字字幕不卡| 久久天天日天天操综合伊人av| 曰曰摸天天摸人人看久久久| 国产精品va久久久久久久| 无码任你躁久久久久久老妇| 久久精品中文字幕大胸| 日韩人妻无码精品久久久不卡| 欧洲精品久久久av无码电影 | 久久99精品综合国产首页| 国产高清国内精品福利99久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 国产三级精品久久| 久久午夜福利电影| 东京热TOKYO综合久久精品| 国产香蕉97碰碰久久人人| 丁香色欲久久久久久综合网| 久久精品九九亚洲精品天堂| 久久精品国产AV一区二区三区| 精品久久久久久无码人妻蜜桃| 91精品国产9l久久久久| 欧美一区二区三区久久综|