• <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>

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(8)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜


            第一個程序:
            #include "stdafx.h"
            #include 
            <iostream>
            using namespace std;
            struct sysop
            {
                
            char name[26];
                
            char quote[64];
                
            int used;
            }
            ;
            const sysop & use(sysop & sysopref);//function with a reference return type
            int main(int argc, char* argv[])
            {
            // NOTE: some implementations require using the keyword static
            // int the two structure declarations to enable initialization
                sysop looper=
                
            {
                    
            "Rick \"Fortran\" Looper",
                    
            "I'm a goto kind of guy."//記住無遺漏逗號
                    0
                }
            ;
                use(looper); 
            //looper is type sysop
                cout<<"Looper: "<<looper.used<<" use(s)\n";
                sysop copycat;
                copycat 
            = use(looper);
                cout
            <<"Looper: "<<looper.used<<" use(s)\n";
                cout
            <<"Copycat: "<<copycat.used<<" use(s)\n";
                cout
            <<"use(looper): "<<use(looper).used<<" use(s)\n";
                
            return 0;
            }


            const sysop & use(sysop & sysopref)
            {
                cout
            <<sysopref.name<<" says:\n";
                cout
            <<sysopref.quote<<endl;
                sysopref.used
            ++;
                
            return sysopref;
                
            // 通常,返回機制將返回值復制到臨時存儲區域中,隨后調用程序將訪問該區域。
                
            // 然而,返回引用意味著調用程序將直接訪問返回值,而不需要拷貝。通常,引
                
            // 用將指向傳遞給函數的引用,因此調用函數實際上是直接訪問自己的一個變量。
            }

            第二個程序:
            #include "stdafx.h"
            #include 
            <iostream>
            #include 
            <string>
            using namespace std;
            string version1(const string & s1,const string & s2);
            const string & version2(string & s1, const string & s2);    //has side effect
            const string & version3(string & s1, const string & s2);    //bad design
            int main(int argc, char* argv[])
            {
                
            string input;
                
            string copy;
                
            string result;

                cout
            <<"Enter a string: ";
                getline(cin, input);
                copy 
            = input;
                cout
            <<"Your string as entered: "<<input<<endl;
                result 
            = version1(input, "***");
                cout
            <<"Your string enhanced: "<<result<<endl;
                cout
            <<"Your original string: "<<input<<endl;

                result
            =version2(input,"###");
                cout
            <<"Your string enhanced: "<<result<<endl;
                cout
            <<"Your original string: "<<input<<endl;
                cout
            <<"Resetting original string.\n";
                input 
            = copy;
                result 
            = version3(input, "@@@");
                cout
            <<"Your string enhanced: "<<result<<endl;
                cout
            <<"Your original string: "<<input<<endl;
                
            return 0;
            }


            /* 接受兩個string參數,并使用string類的相加功能來創建滿足要求的新字符串。
             * 這兩個參數都是const引用。如果使用string對象作為參數,最終結果將不變。
             * 在這種情況下,s1和s2將為string對象。使用引用的效率更高,因為函數不需
             * 要創建新的string對象,并將原來對象中的數據復制到新對象中。
             *
             * temp是一個新的string對象,只在函數version1()中有效,該函數執行完畢后,
             * 它將不再存在。因此,將返回指向temp的引用不可行,因此該函數的返回類型
             * 是string,這意味著temp的內容將被復制到一個臨時返回存儲單元中。然后在
             * main()中,該返回存儲單元的內容將被復制到一個名為result的string中。
             
            */

            string version1(const string & s1, const string & s2)
            {
                
            /* 讀者可能注意到一點,"***"是const char *,而形參s2是const string &
                 * 這是因為,第一,string類定義了一種char *到string得轉換功能,這使得
                 * 可以使用C-style string來初始化string對象,第二,前面討論的類型為const
                 * 引用的形參的一個屬性。假設實參的類型與引用參數類型不匹配,但可被轉換
                 * 為引用類型,程序將創建一個正確類型的臨時變量,使用轉換后的實參值來初
                 * 始化它,然后傳遞一個指向該臨時變量的引用。這種屬性的結果是,如果形參
                 * 類型為const string &,在調用函數時,使用的實參可以是string對象或C-style
                 * string,如用引號括起的字符串字面量、以空字符結尾的char數組或指向char的
                 * 指針變量
                 
            */

                
            string temp;
                temp
            =s2+s1+s2;
                
            return temp;
            }



            /* version2()不能創建臨時string對象,而是直接修改原來的string對象
             * 該函數可以修改s1,因為不同于s2,s1沒有被聲明為const。
             
            */

            const string & version2(string & s1, const string & s2)
            {
                s1
            =s2+s1+s2;
             
            // safe to return reference passed to function
                return s1;
            }


            /* 存在一個致命的缺陷:返回一個指向version3()中聲明的變量的引用。這個函數
             * 能夠通過編譯(但編譯器會發出警告),但當程序視圖執行該函數時將崩潰。是
             * 因為程序視圖引用已經釋放的內存。
             
            */

            const string & version3(string & s1, const string &s2)//bad design
            {
                
            string temp;
                temp
            =s2+s1+s2;
             
            // unsafe to return reference to local variable
                return temp;
            }
            posted on 2010-02-13 12:46 煙皚 閱讀(431) 評論(0)  編輯 收藏 引用 所屬分類: C++ primer plus學習筆記
            91久久精品无码一区二区毛片| 久久综合中文字幕| 久久精品中文字幕第23页| 欧美一级久久久久久久大| 国产精品欧美久久久久无广告 | 国产精品99久久久精品无码| 色婷婷综合久久久中文字幕| 国内精品久久久久伊人av| 久久99精品国产99久久| 久久久久久毛片免费播放| 看全色黄大色大片免费久久久| 国产99久久精品一区二区| 亚洲国产精品无码成人片久久| 欧美午夜A∨大片久久 | 久久久久久极精品久久久| 热99re久久国超精品首页| 久久ZYZ资源站无码中文动漫| 午夜精品久久久久久| 久久久久人妻一区精品| 久久国产一区二区| 无码人妻精品一区二区三区久久久 | 久久精品国产亚洲av麻豆蜜芽 | 久久人人爽人人爽人人片AV麻烦 | 99精品伊人久久久大香线蕉| 人妻丰满?V无码久久不卡| 中文字幕日本人妻久久久免费| 国内精品伊人久久久久AV影院| 亚洲精品高清国产一久久| 偷偷做久久久久网站| 精品久久一区二区三区| 亚洲午夜精品久久久久久浪潮 | 亚洲国产小视频精品久久久三级 | 偷偷做久久久久网站| 精品蜜臀久久久久99网站| 久久影院午夜理论片无码| 2021久久国自产拍精品| 亚州日韩精品专区久久久| 免费观看久久精彩视频| 久久精品国产亚洲AV影院| 久久久WWW成人| 久久久久四虎国产精品|