• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              18 Posts :: 0 Stories :: 84 Comments :: 0 Trackbacks

            公告

            沐楓的個人主頁

            eoool.com生成

            eoool.com生成

            常用鏈接

            留言簿(8)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 56925
            • 排名 - 402

            最新評論

            閱讀排行榜

            評論排行榜

               C語言確實很優(yōu)雅,整個語言的設計簡潔一致。而在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
               無法初始化。而如果不初始化的話,所有的成員而處于無政府狀態(tài),這顯然很不讓人放心。于是,C++提供了專門用于Class的初始化方式--構造函數(shù):
            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;
               有了構造函數(shù),可以在構造函數(shù)的初始化列表中對成員進行初始化。可是很明顯,這里頭還是有一個陷阱,默認構造初始化和非默認構造初始化的調用方式是不一致的。默認構造函數(shù)不能用括號來調用,否則編譯器將會發(fā)瘋:
            Param param();
               它會把上面的語句看成是函數(shù)聲明,而后面調用的時候就會出錯,而錯誤信息可能會讓你抓狂一下。但是這樣也就算了,偏偏 new 可以接受有括號和沒括號兩種寫法:
            Param* p1 = new Param;
            Param
            * p2 = new Param();
               再來說說初始化列表。初始化列表,事實上,也只能支持簡單的標量類型,諸如int,bool,指針之類的;復雜點的,如數(shù)組、結構,不好意思,不支持--只能在構造函數(shù)體中進行賦值。還有一個很迷糊初學者的問題是,成員初始化的順序僅依賴于成員定義的順序,而不是初始化列表中的順序。

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

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

               橫向比較,這次好象C++還不會太落伍,只有C和動態(tài)語言提供了初始化特性,其它支持OO高級語言好象都是學C++的。如Java, C#(注C#3.0開始提供初始化功能)...
               
               C++能不能做到簡潔一致的實始化呢?
               Boost的assign庫做了許多有益的工作。使用assign庫,至少現(xiàn)在可以初始化了:
            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經(jīng)過許多努力,也僅能支持容器的初始化,而且還不夠漂亮。

               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"} ); // 參數(shù)是兩個元素的列表

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

            map
            <string,int> anim = 

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

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

            Feedback

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

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

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

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

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

              回復  更多評論
              

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

            亚洲综合精品香蕉久久网97 | 久久夜色精品国产www| 日产精品久久久一区二区| 要久久爱在线免费观看| 人妻无码久久精品| 亚洲日本va午夜中文字幕久久 | 91精品国产91久久综合| 久久久久久久久无码精品亚洲日韩| 久久久一本精品99久久精品88| 亚洲国产另类久久久精品小说| 午夜天堂av天堂久久久| 久久久久亚洲AV无码麻豆| 热re99久久精品国99热| 精品国产乱码久久久久久郑州公司 | 久久无码AV一区二区三区| 中文国产成人精品久久不卡| 色欲综合久久躁天天躁蜜桃| 99久久婷婷免费国产综合精品| 久久亚洲欧美日本精品| 久久精品这里只有精99品| 综合久久精品色| 99久久中文字幕| 一本久久a久久精品综合香蕉 | 久久精品国产亚洲av影院| 国内精品久久久久久野外| 久久99亚洲综合精品首页| 亚洲另类欧美综合久久图片区| 99久久人妻无码精品系列 | 99精品伊人久久久大香线蕉| 欧美午夜精品久久久久久浪潮| 久久久久无码精品国产不卡| 久久国产三级无码一区二区| 日韩精品久久无码中文字幕| 99久久婷婷国产一区二区| 一本色道久久HEZYO无码| www亚洲欲色成人久久精品| 99久久国产宗和精品1上映| 91麻精品国产91久久久久| 久久99精品久久久久久久久久| 色婷婷综合久久久久中文字幕| 国内精品久久久久影院免费|