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

            愛老婆,要比編程多一點...

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              18 Posts :: 0 Stories :: 84 Comments :: 0 Trackbacks

            公告

            沐楓的個人主頁

            eoool.com生成

            eoool.com生成

            常用鏈接

            留言簿(8)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 56912
            • 排名 - 402

            最新評論

            閱讀排行榜

            評論排行榜

               C語言確實很優雅,整個語言的設計簡潔一致。而在C++中,有一個讓人詬病的問題就是變量初始化的不一致性。
               C語言中的初始化,都是用花括號進行,簡單美觀:

            int array[] = {1,2,3,4,5};
            struct Point point = {23};
            struct Point arrPoint[] = 
            {
              {
            2,3},
              {
            4,5},
              {
            6,7}
            };

               C++自然也兼容了C語言的初始化機制。然而,C++的Class乃至STL都不支持。它們要用不同的方式來初始化, 甚至根本不能夠直接初始化, 只能使用運行時的賦值。
               比如Class:
            class Param
            {
            public:
              
            int Age;
              
            int Value;
            private:
              
            int Level;
            };

            Param param 
            = {2,3}; // ERROR
            Param param = {2,3,4}; //ERROR
               無法初始化。而如果不初始化的話,所有的成員而處于無政府狀態,這顯然很不讓人放心。于是,C++提供了專門用于Class的初始化方式--構造函數:
            class Param
            {
            public:
              Param(
            int x, int y)
                : x_(x), y_(y)
              {}
              Param()
                : x_(
            0), y_(0)
              {}
            private:
              
            int x_, y_;
            };

            Param param(
            1,2);
            //
            Param param;
               有了構造函數,可以在構造函數的初始化列表中對成員進行初始化。可是很明顯,這里頭還是有一個陷阱,默認構造初始化和非默認構造初始化的調用方式是不一致的。默認構造函數不能用括號來調用,否則編譯器將會發瘋:
            Param param();
               它會把上面的語句看成是函數聲明,而后面調用的時候就會出錯,而錯誤信息可能會讓你抓狂一下。但是這樣也就算了,偏偏 new 可以接受有括號和沒括號兩種寫法:
            Param* p1 = new Param;
            Param
            * p2 = new Param();
               再來說說初始化列表。初始化列表,事實上,也只能支持簡單的標量類型,諸如int,bool,指針之類的;復雜點的,如數組、結構,不好意思,不支持--只能在構造函數體中進行賦值。還有一個很迷糊初學者的問題是,成員初始化的順序僅依賴于成員定義的順序,而不是初始化列表中的順序。

               再比如STL容器,這下好象更慘,連構造函數都幫不上忙了,除了初始化一個空的容器,或是復制一下別的容器,我們只能做用默認構造函數進行初始化。我們拿數組和vecotr做個比較:
            // 數組
            int arr[]={1,2,3,4};
            // vector
            vector<int> iarr;
            // 必須在某個函數中賦初值
            void init()
            {
              
            for(int i = 1; i <= 4++i) 
                iarr.push_back(i);
            }

               再復雜一點的數據結構,那單單賦值程序就要寫上老長,而且還不好看。還要記得調用。這對于僅僅是簡單的設置一些初值的用途來說,太過于煩瑣。

               橫向比較,這次好象C++還不會太落伍,只有C和動態語言提供了初始化特性,其它支持OO高級語言好象都是學C++的。如Java, C#(注C#3.0開始提供初始化功能)...
               
               C++能不能做到簡潔一致的實始化呢?
               Boost的assign庫做了許多有益的工作。使用assign庫,至少現在可以初始化了:
            vector<int> arr = list_of(1)(2)(3)(4);   

            typedef boost::tuple
            <int,std::string,int> tuple;
            vector
            <tuple> v = tuple_list_of( 1"foo"2 )( 3"bar"4 );

            map
            <int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

            stack
            <string> names = list_of( "Mr. Foo" )( "Mr. Bar")( "Mrs. FooBar" ).to_adapter();
               如果是賦值,也可以簡略很多:
            vector<int> v;
            += 1,2,3,repeat(10,4),5,6,7,8,9;
            // v = [1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,7,8,9]
              不過,也僅能如此了。assign經過許多努力,也僅能支持容器的初始化,而且還不夠漂亮。

               C++0x已確定提供與C一致的初始化功能。 Initialer lists Initializer Lists for Standard Containers Initializer lists WP wording 等草案就是為了這個目的服務的。
               如果使用C++0x,那么程序的初始化將變得清晰和一致:
            complex<double> z = {1,2}; 
            //
            complex<double> z {1,2}; 
            // 初始化中,有等號和無等號都是允許的,下同。
            += {2,3};

            int a = {1}; 

            new vector<string>{"once""upon""a""time"}; 

            f( {
            "Nicholas""Annemarie"} ); // 參數是兩個元素的列表

            return { "Norah" }; // 返回只有一個元素的列表
             
            int* e {};  // 初始化為0或NULL指針

            map
            <string,int> anim = 

              {
            "bear",4}, 
              {
            "cassovary",2}, 
              {
            "tiger",7
            }; 

               這好象是C++欠了十多年的債吧。
               
            posted on 2007-09-27 17:39 沐楓 閱讀(2694) 評論(6)  編輯 收藏 引用 所屬分類: C++

            Feedback

            # re: 從賦值到初始化 2007-09-27 20:37 愛子
            QQ群名稱:游戲編程學習和開發M
            QQ群號碼:43047318
            創建人QQ號碼:光愛之子(273612158)
            QQ群描述:群里是可以提供游戲和有關游戲編程知識。同時還有數據結構學習。 和一些懂得操作系統原理的人 希望你加入。 謝謝!還有游戲策劃,運營有關方面知識。   回復  更多評論
              

            # re: 從賦值到初始化 2007-09-28 00:15 lovedday
            C++,拙劣的設計,D語言正式出來后我估計就不想用C++了。  回復  更多評論
              

            # re: 從賦值到初始化 2007-09-28 14:09 shen126
            呵呵,很喜歡樓主的選題和風格.
            Thanks!  回復  更多評論
              

            # re: 從賦值到初始化 2007-09-30 14:08 空明流轉
            我還真不覺得這樣有什么好。。。只是現在用C#,覺得C++不支持構造函數的多態行為是一件多么讓人感到麻煩的事情。  回復  更多評論
              

            # re: 從賦值到初始化 2007-10-04 16:21 chenjh
            樓主你好,你對C++真是了解,不知你能否幫我解說下我手上的程序,是用C++編寫的關于偽彩色處理的,不知可否?謝謝!

              回復  更多評論
              

            # re: 從賦值到初始化 2007-10-06 23:10 沐楓
            @空明流轉
            我也用C#的啊?可是怎么不知道c#居然有構造函數多態行為。
            你可能是指從一個構造函數調用另一個構造函數吧。
            C++將會在下一個標準中增加這個功能。  回復  更多評論
              

            无码8090精品久久一区| 久久成人影院精品777| 亚洲精品视频久久久| 久久久久久精品免费看SSS| 久久亚洲精品成人AV| 久久综合综合久久97色| 亚洲另类欧美综合久久图片区| 亚洲AV日韩精品久久久久| 91久久成人免费| 无码人妻久久一区二区三区免费丨| 97久久综合精品久久久综合| 久久国产高清一区二区三区| 青青草原精品99久久精品66| 久久国产高清一区二区三区| 久久亚洲私人国产精品| 久久久免费观成人影院| 久久久久综合网久久| 国内精品九九久久精品| 蜜臀久久99精品久久久久久| 久久99精品国产麻豆| 狠狠色丁香久久婷婷综合| 久久婷婷五月综合成人D啪| 久久久国产精品网站| 久久国产色AV免费看| 精品久久久中文字幕人妻| 性做久久久久久免费观看| 国产91久久综合| 夜夜亚洲天天久久| 91亚洲国产成人久久精品| 久久er国产精品免费观看2| AV色综合久久天堂AV色综合在| 久久精品中文字幕一区| 中文成人久久久久影院免费观看| 国产激情久久久久影院老熟女免费| 99热成人精品热久久669| 欧洲成人午夜精品无码区久久| 久久只有这精品99| 狠狠色狠狠色综合久久| 伊人久久综合无码成人网| 综合久久国产九一剧情麻豆| 奇米综合四色77777久久|