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

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 56907
            • 排名 - 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++將會在下一個標準中增加這個功能。  回復  更多評論
              

            97久久精品国产精品青草| 7777精品久久久大香线蕉| 久久国产精品无码HDAV| 久久久久亚洲AV成人片| 久久美女人爽女人爽| 国内精品久久久久久久影视麻豆| 久久综合狠狠综合久久97色| 久久亚洲精品国产精品婷婷| 香蕉久久av一区二区三区| 久久精品国产亚洲av麻豆色欲| 亚洲成色999久久网站| 亚洲人成无码久久电影网站| 丰满少妇高潮惨叫久久久| 国产精品99久久久久久董美香| 一97日本道伊人久久综合影院| 国产麻豆精品久久一二三| 久久精品中文字幕一区| 欧美一区二区三区久久综| 久久久久久久综合日本亚洲| 亚洲日本va午夜中文字幕久久| 国产一级做a爰片久久毛片| 亚洲日韩欧美一区久久久久我 | 久久久久国产日韩精品网站| 久久无码中文字幕东京热| 国产精品亚洲综合专区片高清久久久 | 亚洲精品无码专区久久久| 久久夜色撩人精品国产| 女人香蕉久久**毛片精品| 麻豆av久久av盛宴av| 欧美久久亚洲精品| 九九热久久免费视频| 久久中文娱乐网| 国产一区二区精品久久| 久久无码人妻一区二区三区午夜| 亚洲欧美精品一区久久中文字幕 | 国产精品久久久天天影视香蕉 | 久久精品免费观看| 久久99精品久久久久久久久久| 思思久久精品在热线热| 久久久久久免费视频| 一本大道久久香蕉成人网|