• <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>
            Impossible is nothing  
              愛過知情重醉過知酒濃   花開花謝終是空   緣份不停留像春風來又走   女人如花花似夢
            公告
            日歷
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567
            統計
            • 隨筆 - 8
            • 文章 - 91
            • 評論 - 16
            • 引用 - 0

            導航

            常用鏈接

            留言簿(4)

            隨筆分類(4)

            隨筆檔案(8)

            文章分類(77)

            文章檔案(91)

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             
              

            一個函數在一個特定的域中被多次聲明時,編譯器解析第二個及后面函數依照下面步驟:

            1.參數個數或類型不同,則認為是重載
             // 重載函數
             void print( const string & );
             void print( vector<int> & );
            2.函數返回類型和參數表完全相同,則認為第二個函數是第一個函數的重復聲明
             參數表的比較過程與參數名無關
            3.如果兩個函數的參數表相同但是返回類型不同則第一個聲明被視為第一個的錯
            誤重復聲明會被標記為編譯錯誤,例如
             unsigned int max( int i1, int i2 );
             int max( int , int ); // 錯誤: 只有返回類型不同
            函數的返回類型不足以區分兩個重載函數
            4.如果在兩個函數的參數表中只有缺省實參不同則第二個聲明被視為第一個的重
            復聲明例如
             // 聲明同一函數
             int max( int *ia, int sz );
             int max( int *, int = 10 );

             typedef 名為現有的數據類型提供了一個替換名它并沒有創建一個新類型因此如果
            兩個函數參數表的區別只在于一個使用了typedef 而另一個使用了與typedef 相應的類型
            則該參數表不被視為不同的下列calc()的兩個函數聲明被視為具有相同的參數表第二個
            聲明導致編譯時刻錯誤因為雖然它聲明了相同的參數表但是它聲明了與第一個不同的返
            回類型
            // typedef 并不引入一個新類型
            typedef double DOLLAR;
            // 錯誤: 相同參數表不同返回類型
            extern DOLLAR calc( DOLLAR );
            extern int calc( double );

             當一個參數類型是const 或volatile 時在識別函數聲明是否相同時并不考慮const 和
            volatile 修飾符例如下列兩個聲明聲明了同一個函數
            // 聲明同一函數
            void f( int );
            void f( const int );
            參數是const 這只跟函數的定義有關系它意味著函數體內的表達式不能改變參數的
            值但是對于按值傳遞的參數這對函數的用戶是完全透明的用戶不會看到函數對按值
            傳遞的實參的改變按值傳遞的實參以及參數的其他傳遞方式在7.3 節中討論當實參
            被按值傳遞時將參數聲明為const 不會改變可以被傳遞給該函數的實參種類任何int 型的
            實參都可以被用來調用函數f(const int) 因為兩個函數接受相同的實參集所以剛才給出的
            兩個聲明并沒有聲明一個重載函數函數f()可以被定義為
            void f( int i ) { }

            void f( const int i ) { }
            然而在同一個程序中同時提供這兩個定義將產生錯誤因為這些定義把一個函數定義
            了兩次
            但是如果把const 或volatile 應用在指針或引用參數指向的類型上則在判斷函數聲明

            是否相同時就要考慮const 和volatile 修飾符
            // 聲明了不同的函數
            void f( int* );
            void f( const int* );
            // 也聲明了不同的函數
            void f( int& );
            void f( const


             有時候沒有必要重載可能也不需要不同的函數定義在某些情況下缺省實參可以
            把多個函數聲明壓縮為一個函數中例如兩個光標函數
            moveAbs(int,int);
            moveAbs(int,int,char*);
            可以通過第三個char*型參數的有無來區分如果這兩個函數的實現十分類似并且在向
            函數傳遞參數時如果能夠找到一個char*型缺省實參可以表示實參不存在時的意義則這兩
            個函數就可以被合并現在正好有個這樣的缺省實參--值為0 的指針
            move( int, int, char* = 0 );
            程序員最好抱這樣的觀點并不是每個語言特性都是你要攀登的下一座山峰使用語言
            的特性應該遵從應用的邏輯而不是簡單地因為它的存在就必須要使用它程序員不應該勉
            強使用重載函數只有在必要的地方使用它們才會讓人感覺自

            using 聲明怎樣影響重載函數呢using 聲明為一個名字空間的成員在該聲明出現的域中
            提供了一個別名下面程序中的using 聲明會怎么樣呢
            namespace libs_R_us {
            int max( int, int );
            int max( double, double );
            extern void print( int );
            extern void print( double );
            }
            // using 聲明
            using libs_R_us::max;
            using libs_R_us::print( double ); // 錯誤
            void func()
            {
            max( 87, 65 ); // 調用 libs_R_us::max( int, int )
            max( 35.5, 76.6 ); // 調用 libs_R_us::max( double, double )
            }
            第一個using 聲明向全局域中引入了兩個libs_R_us::max()函數于是我們便可以在func()
            中調用這兩個max()函數函數調用時的實參類型將決定哪個函數會被調用第二個using 聲
            明是個錯誤用戶不能在using 聲明中為一個函數指定參數表對于libs_R_us::pring()惟一有
            效的using 聲明是
            using libs_R_us::print;


            如果using 聲明向一個域中引入了一個函數而該域中已經存在一個同名的函數又會
            怎樣呢記住using 聲明只是一個聲明由using 聲明引入的函數就好像在該聲明出現的地
            方被聲明一樣因此由using 聲明引入的函數重載了在該聲明所出現的域中同名函數的其
            他聲明例如
            375 第九章 重載函數
            #include <string>
            namespace libs_R_us {
            extern void print( int );
            extern void print( double );
            }
            extern void print( const string & );
            // libs_R_us::print( int ) 和 libs_R_us::print( double )
            // 重載 print( const string & )
            using libs_R_us::print;
            void fooBar( int ival )
            {
            print( "Value: " ); // 調用全局 print( const string & )
            print( ival ); // 調用 libs_R_us::print( int )
            }
            using 聲明向全局域中加入了兩個聲明一個是print(int) 一個是print(double) 這些聲
            明為名字空間libs_R_us 中的函數提供了別名這些聲明被加入到print()的重載函數集合中
            它已經包含了全局函數print(const string&) 當fooBar()調用函數時所有的print()函數都將
            被考慮


            如果using 聲明向一個域中引入了一個函數而該域中已經有同名函數且具有相同的參
            數表則該using 聲明就是錯誤的如果在全局域中已經存在一個名為print(int)的函數則
            using 聲明不能為名字空間libs_R_us 中的函數聲明別名print(int) 例如
            namespace libs_R_us {
            void print( int );
            void print( double );
            }
            void print( int );
            using libs_R_us::print; // 錯誤: print(int) 的重復聲明
            void fooBar( int ival )
            {
            print( ival ); // 哪一個 print? ::print 還是 libs_R_us::print?
            }


            posted on 2006-02-22 22:47 笑笑生 閱讀(219) 評論(0)  編輯 收藏 引用 所屬分類: C++語言
             
            Copyright © 笑笑生 Powered by: 博客園 模板提供:滬江博客
            日本免费一区二区久久人人澡| 亚洲狠狠婷婷综合久久久久 | 久久久久亚洲AV无码专区桃色| 久久精品无码专区免费| 91精品国产乱码久久久久久| 日韩人妻无码一区二区三区久久99| 99热热久久这里只有精品68| 2022年国产精品久久久久| 久久夜色精品国产噜噜麻豆 | 色综合久久综合中文综合网| 国产成人久久精品一区二区三区| 无遮挡粉嫩小泬久久久久久久| 久久久久亚洲AV成人网人人软件| 亚洲国产成人久久综合一 | 国内精品九九久久久精品| 亚洲AV无码久久精品蜜桃| 新狼窝色AV性久久久久久| 亚洲国产精品无码久久久蜜芽| 亚洲中文字幕无码一久久区| 97精品国产97久久久久久免费| 波多野结衣久久| 色88久久久久高潮综合影院 | 999久久久国产精品| 国産精品久久久久久久| 色欲综合久久躁天天躁| 中文成人无码精品久久久不卡 | 精品国产乱码久久久久久人妻| 国产亚洲精品久久久久秋霞| 亚洲日韩中文无码久久| 久久精品国产亚洲精品| 一本色道久久综合亚洲精品| 色综合合久久天天给综看| 欧美久久一区二区三区| 欧美伊人久久大香线蕉综合| 伊人久久综合无码成人网| 亚洲va久久久噜噜噜久久天堂 | 久久精品视屏| 国内精品伊人久久久久妇| 久久精品国产久精国产思思| 99久久夜色精品国产网站| 超级碰碰碰碰97久久久久|