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

            MyMSDN

            MyMSDN記錄開發(fā)新知道

            C++ notes (3)

            21、vector的動態(tài)增長優(yōu)于預先分配內(nèi)存。

            使用vector的時候最好動態(tài)地添加元素。它不同于C和Java或其他語言的數(shù)據(jù)類型,為了達到連續(xù)性,更有效的方法是先初始化一個空vector對象,然后再動態(tài)添加元素,而不是預先分配內(nèi)存。

            22、vector值初始化

            內(nèi)置->0

            有默認構(gòu)造->調(diào)用默認構(gòu)造

            無默認構(gòu)造,有其他構(gòu)造->程序員手動提供初始值

            無默認構(gòu)造,也無其他構(gòu)造->標準庫產(chǎn)生一個帶初值的對象

            23、數(shù)組下標的類型

            C++中,數(shù)組下標的正確類型是size_t而不是int,size_t是一個與機器相關(guān)的unsigned類型。

            24、在聲明指針的時候,可以用空格將符號*與其后的標識符分隔開來,string *ps與string* ps都是可以的,但后者容易產(chǎn)生誤解,如:

            string* ps1,ps2;     //ps1是指針,而ps2是一個string對象

            也就是說,人們可能誤把string和string*當作兩個類型,或者說string*被當作一種新類型來看待,但這是錯的!

            25、一個有效的指針必然是以下三種狀態(tài)之一:

            1. 保存特定的對象的地址;
            2. 指向某個對象后面的另一對象;
            3. 或者是0值。表明它不指向任何對象。

            其中int *pi=0;與int *pi;是不同的。前者是初始化指針指向0地址的對象(即為NULL)(pi initialized to address to no object),后者卻是未初始化的(ok, but dangerous, pi is uninitialized)。

            編譯器可以檢測出0值的指針,程序可判斷該指針并未指向一個對象,而未初始化的指針的使用標準并未定義,對大多數(shù)編譯器來說,如果使用未初始化的指針會將指針中存放的不確定值視為地址,然后操縱該內(nèi)存地址中存放的位內(nèi)容,使用未初始化的指針相當于操縱這個不確定的地址中存儲的基礎數(shù)據(jù),因此對未初始化的指針進行解引用時,通常會導致程序崩潰。

            26、void*指針

            void*指針只支持幾種有限的操作:

            1. 與另一個指針進行比較;
            2. 向函數(shù)傳遞void*指針或從函數(shù)返回void*指針;
            3. 給另一個void*指針賦值。

            不允許使用void*指針操縱它所指向的對象。

            27、指針和引用的比較(P105)

            雖然使用引用(reference)和指針都可間接訪問另一個值,但它們之間有兩個重要區(qū)別。第一個區(qū)別在于引用總是指向某個對象:定義引用時沒有初始化是錯誤的。第二個重要區(qū)別則是賦值行為的差異:給引用賦值修改的是該引用所關(guān)聯(lián)的對象的值,而并不是使引用與另一個對象關(guān)聯(lián)。引用一經(jīng)初始化,就始終指向同一個特定對象(這就是為什么引用必須在定義時初始化的原因)。

            28、指針與typedef(P112)

            const放在類型前和放在類型后都可以表示同樣的意思:

            const string s1;
            string const s2;

            s1和s2均表示常量字符串對象。

            但因此就導致了下面的句子可能產(chǎn)生誤解:

            typedef string *pstring;
            const pstring cstr;

            容易錯把typedef當成文本擴展而產(chǎn)生下面的理解:

            const string *cstr; //這并非上面例子的正確意思!(錯誤)

            應該從聲明的句子看,也就是說只看const pstring cstr;,在這里pstring是一種指針類型,const修飾的是這個類型,因此正確的理解應該是:

            string *const cstr;

            而const pstring cstr;其實可以表示為pstring const cstr;,這樣的寫法則不容易產(chǎn)生誤解。從右向左閱讀的意思就是:cstr是const pstring類型,即指向string對象的const指針。

            29、創(chuàng)建動態(tài)數(shù)組(注意點見代碼注釋)

            const char *cp1 = "some value";
            char *cp2 = "other value";
            
            int *piArray1 = new int[10];    //內(nèi)置類型沒有初始化
            int *piArray2 = new int[10]();    //內(nèi)置類型需要加空圓括號,對數(shù)組元素進行初始化
            std::string *psArray1 = new std::string[10];    //默認構(gòu)造函數(shù)初始化
            
            std::cout<<"----------"<<std::endl
                <<"*cp1\t\t:"<<*cp1<<std::endl
                <<"*cp2\t\t:"<<*cp2<<std::endl
                <<"*piArray1\t:"<<*piArray1<<std::endl
                <<"*piArray2\t:"<<*piArray2<<std::endl
                <<"*psArray1\t:"<<*psArray1<<std::endl
                <<"----------"<<std::endl;

            但是下面的結(jié)果卻與概念上的不同:

            ////Visual Studio & MS VC++
            //----------                   
            //*cp1            :s
            //*cp2            :o
            //*piArray1       :-842150451
            //*piArray2       :0
            //*psArray1       :
            //----------
            ////Eclipse&G++
            //----------
            //*cp1        :s
            //*cp2        :o
            //*piArray1    :4064608
            //*piArray2    :4064560
            //*psArray1    :
            //----------

            看來不同的編譯器對此的定義還是有所不同,注意看*piArray2的值,按照說明應該是初始化為0,但這里卻仍然表現(xiàn)出與*piArray1一樣的值,說明并沒有發(fā)生初始化。

            對于動態(tài)分配的數(shù)組,其元素只能初始化為元素類型的默認值,而不能像數(shù)組變量一樣,用初始化列表為數(shù)組元素提供各不相同的初值。

            30、const對象的動態(tài)數(shù)組

            //P118
            //error:uninitialized const array
            const int *pciArray1 = new const int[10];
            //ok:value-initialized const array
            const int *pciArray2 = new const int[10]();
            std::cout<<*pciArray1<<std::endl;
            std::cout<<*pciArray2<<std::endl;

            上面的示例的注釋來自書中,但在VC++編譯器和G++編譯器下卻不同,具體表現(xiàn)為:

            • VC++:編譯正確,第一句輸出隨機地址的值,第二句輸出初始化的0(其中按照“標準”第一種因為未向const變量初始化,應該無法通過編譯,但這里可以)
            • G++:編譯錯誤,第一句的錯誤信息為“uninitialized const in `new' of `const int'”,但第二句按照標準應該輸出0的,這里卻輸出了隨機地址的值。

            看來兩個編譯器對這一問題的看法不太一致。

            posted on 2008-12-25 16:13 volnet 閱讀(1677) 評論(5)  編輯 收藏 引用 所屬分類: C++ Primer 學習筆記

            評論

            # re: C++ notes (3) 2008-12-25 23:56 夜弓

            >>在聲明指針的時候,可以用空格將符號*與其后的標識符分隔開來,string *ps與string* ps都是可以的,但后者容易產(chǎn)生誤解

            雖然一般大家都推薦使用string *p
            但我覺得string* p更能表達出p的類型
            C++是一門龐大的語言,同樣也是一門優(yōu)美的語言
            在絕大部分地方它都是邏輯自洽的
            相比而言,string* p就比string *p更優(yōu)美
            如果C++可以像java一樣把數(shù)組寫成
            int[] array的話,就更好了

            至于這個問題
            始終在單行定義變量同樣可以解決。  回復  更多評論   

            # re: C++ notes (3) 2008-12-26 00:03 volnet

            @夜弓
            其實不論是哪種類型,自己用習慣了就可以,另外一種,大致了解,以便不會在別人的代碼中暈菜即可……
            單行的確可以解決這個問題,恩,不過在變量一多的時候,我們可能更經(jīng)常用多行,事實上,這個也是習慣問題。而且單行可以更好的地注釋變量,而多行則通常適用于同一注釋的多個變量聲明  回復  更多評論   

            # re: C++ notes (3) 2008-12-26 09:43 飄飄白云

            21、vector的動態(tài)增長優(yōu)于預先分配內(nèi)存。

            使用vector的時候最好動態(tài)地添加元素。它不同于C和Java或其他語言的數(shù)據(jù)類型,為了達到連續(xù)性,更有效的方法是先初始化一個空vector對象,然后再動態(tài)添加元素,而不是預先分配內(nèi)存。

            -------------------------------------------------------
            我記得C++編程思想里面說的給vector預先指定目標容量遠比頻繁push_back來著有效的多,尤其是元素是對象的時候。 這個也算是預先分配內(nèi)存的吧,減少內(nèi)存碎片  回復  更多評論   

            # re: C++ notes (3) 2008-12-26 16:00 volnet

            @飄飄白云
            你說的在理,這句話是Lippman說的,話說他們都是大牛,現(xiàn)在看相信誰的了……
            這可能涉及到不同的標準庫實現(xiàn)方式,看來這個問題要么應該忽略掉,根據(jù)實際需求,可以加的就加,不可以加的就算了。
            希望有達人來解釋一下  回復  更多評論   

            # re: C++ notes (3) 2008-12-27 10:28 夜弓

            @volnet
            你說的在理
            第一是自己習慣
            第二是公司的code style接受
            @飄飄白云
            看是什么東西吧
            有些構(gòu)造函數(shù)開銷很大
            但是復制構(gòu)造函數(shù)開銷不大的(shared_ptr 淺復制)
            初始化vector為空就很好
            比如說SqlConnection  回復  更多評論   

            特殊功能
             
            性高湖久久久久久久久AAAAA| 亚洲七七久久精品中文国产| 中文字幕乱码久久午夜| 久久久久久久精品成人热色戒| 国产精品成人久久久| 77777亚洲午夜久久多人| 亚洲国产精品无码久久| 久久精品免费观看| 一97日本道伊人久久综合影院| 99久久精品免费看国产一区二区三区 | 亚洲午夜福利精品久久| 中文字幕乱码人妻无码久久| 99久久国产亚洲高清观看2024| 理论片午午伦夜理片久久 | 99久久国产免费福利| 久久人人爽人人爽人人片AV东京热 | 国产欧美一区二区久久| 午夜精品久久久久久久无码| 久久w5ww成w人免费| 欧美性大战久久久久久| 欧美精品一区二区精品久久| 久久久久久国产精品无码下载 | 亚洲av成人无码久久精品| 国产精品免费久久久久久久久 | 国产成人精品久久亚洲| 日韩欧美亚洲综合久久| 国产精品热久久无码av| 精品乱码久久久久久久| 亚洲一区精品伊人久久伊人 | 国产精品欧美久久久久无广告| 久久亚洲日韩精品一区二区三区| 九九热久久免费视频| 99久久夜色精品国产网站| 久久AV高清无码| 久久综合狠狠综合久久| 777午夜精品久久av蜜臀 | 无码人妻久久一区二区三区 | 久久这里都是精品| 久久久久人妻精品一区三寸蜜桃 | 亚洲国产精久久久久久久| 国产成人AV综合久久|