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

            愛(ài)老婆,要比編程多一點(diǎn)...

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              18 Posts :: 0 Stories :: 84 Comments :: 0 Trackbacks

            公告

            沐楓的個(gè)人主頁(yè)

            eoool.com生成

            eoool.com生成

            常用鏈接

            留言簿(8)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 56900
            • 排名 - 402

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

               C語(yǔ)言確實(shí)很優(yōu)雅,整個(gè)語(yǔ)言的設(shè)計(jì)簡(jiǎn)潔一致。而在C++中,有一個(gè)讓人詬病的問(wèn)題就是變量初始化的不一致性。
               C語(yǔ)言中的初始化,都是用花括號(hào)進(jìn)行,簡(jiǎn)單美觀:

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

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

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

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

               再?gòu)?fù)雜一點(diǎn)的數(shù)據(jù)結(jié)構(gòu),那單單賦值程序就要寫上老長(zhǎng),而且還不好看。還要記得調(diào)用。這對(duì)于僅僅是簡(jiǎn)單的設(shè)置一些初值的用途來(lái)說(shuō),太過(guò)于煩瑣。

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

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

            int a = {1}; 

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

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

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

            map
            <string,int> anim = 

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

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

            Feedback

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

            # re: 從賦值到初始化 2007-09-28 00:15 lovedday
            C++,拙劣的設(shè)計(jì),D語(yǔ)言正式出來(lái)后我估計(jì)就不想用C++了。  回復(fù)  更多評(píng)論
              

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

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

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

              回復(fù)  更多評(píng)論
              

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

            久久强奷乱码老熟女网站| 国产精品欧美久久久天天影视| 久久精品国产色蜜蜜麻豆| 久久亚洲精品无码AV红樱桃| 亚洲日韩欧美一区久久久久我| 国内精品久久久久影院亚洲| 精品久久8x国产免费观看| 久久国产视屏| 久久久久国产一级毛片高清版| 亚洲国产另类久久久精品| 香蕉99久久国产综合精品宅男自| 久久综合九色综合97_久久久 | 婷婷五月深深久久精品| 国产精品伊人久久伊人电影| 亚洲狠狠婷婷综合久久蜜芽| 国内精品伊人久久久久网站| 久久精品国产99国产电影网| 亚洲性久久久影院| 久久婷婷人人澡人人爽人人爱 | 欧美性猛交xxxx免费看久久久| 无码人妻久久一区二区三区免费 | 久久久无码一区二区三区| 99久久夜色精品国产网站 | 一本久久知道综合久久| 亚洲精品国精品久久99热一| 国产精品久久久久久五月尺| 中文成人久久久久影院免费观看| 久久一区二区三区免费| 亚洲精品99久久久久中文字幕 | 亚洲国产视频久久| 久久精品国产99国产精品| 久久久久国产一区二区三区| 久久午夜无码鲁丝片午夜精品| 久久成人精品| 激情综合色综合久久综合| 久久人搡人人玩人妻精品首页| 久久久久一级精品亚洲国产成人综合AV区 | 亚洲人AV永久一区二区三区久久| 久久精品人妻一区二区三区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 人妻丰满?V无码久久不卡|