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

            1、標(biāo)識符命名規(guī)則!

            標(biāo)識符不能包含兩個連續(xù)的下劃線,也不能以下劃線開頭后面緊跟一個大寫字母。有些標(biāo)識符(在函數(shù)外定義的標(biāo)識符)不能以下劃線開頭。

            但是在G++編譯器和VC編譯器下,二者均可正確編譯!

            Eclipse&G++Visual studio 2008

            2、跨平臺編譯程序!

            這里不是要講解如何跨平臺編譯程序,也不是告訴你如何更好地編寫通用平臺的程序規(guī)則,那可能涉及到很多的宏定義以及硬件相關(guān)特性。這里僅為使用示例代碼提供一種精簡的方式。

            用Eclipse+MinGW的方式默認會很精簡,所以把它當(dāng)作一種目標(biāo)!

            用Visual Studio 2008創(chuàng)建的程序會讓你引入預(yù)編譯頭stdafx.h(這通常發(fā)生在使用Visual Studio創(chuàng)建Win32控制臺應(yīng)用程序,并直接點擊“完成”后),這將導(dǎo)致你無法將在Eclipse上編寫的程序直接運行在Visual Studio上。這時你應(yīng)該通過修改項目屬性來獲得這種精簡的方式:(選擇項目,右鍵屬性,選擇配置屬性->C/C++->預(yù)編譯頭->創(chuàng)建/使用預(yù)編譯頭,選擇“不使用預(yù)編譯頭”->“確定”后再次編譯即可!)

            properties

            3、變量命名習(xí)題

            //測試變量命名!
            //error C2632: “int”后面的“double”非法
            //int double = 3.14159;
            //-------------------------------------------------
            char _='a';
            std::cout<<_<<std::endl;
            //-------------------------------------------------
            //warning C4091: “”: 沒有聲明變量時忽略“bool”的左側(cè)
            //error C2059: 語法錯誤: “-”
            //bool catch-22;
            //-------------------------------------------------
            //error C2059: 語法錯誤: “數(shù)字上的錯誤后綴”
            //char 1_or_2 = '1';
            //-------------------------------------------------
            float Float=3.14f;
            std::cout<<Float<<std::endl;

            4、在C++中,“初始化不是賦值”

            初始化指創(chuàng)建變量并給它賦初始值,而賦值則是擦除對象的當(dāng)前值并用新值代替。

            int ival(1024); //直接初始化
            int ival = 1024; //復(fù)制初始化

            直接初始化語法更靈活,效率更高!

            對內(nèi)置類型來說,復(fù)制初始化和直接初始化幾乎沒有差別。

            對類類型來說,有些初始化僅能用直接初始化完成。要想理解其中緣由,需要初步了解類是如何控制初始化的。

            例如:

            也可以通過一個計數(shù)器和一個字符初始化string對象。這樣創(chuàng)建的對象包含重復(fù)多次的指定字符,重復(fù)次數(shù)由計數(shù)器指定:

            std::string all_nines(10, ‘9’); //all_nines = “9999999999”;

            本例中,初始化all_nines的唯一方法是直接初始化。有多個初始化式時不能使用復(fù)制初始化。(V注:這里的初始化式即為構(gòu)造函數(shù)的多個重載;這里所謂的“不能使用”應(yīng)該是“功能有所不及”的意思!)

            5、變量初始化規(guī)則

            使用未初始化的變量經(jīng)常導(dǎo)致錯誤,而且十分隱蔽。問題出在未初始化的變量事實上都有一個值。編譯器把該變量放到內(nèi)存中的某個位置,而把這個位置的無論哪種位模式都當(dāng)成是變量初始的狀態(tài)。當(dāng)被解釋成整型值時,任何位模式都是合法的值——雖然這個值不可能是程序員想要的。因為這個值合法,所以使用它也不可能導(dǎo)致程序崩潰。可能的結(jié)果是導(dǎo)致程序錯誤執(zhí)行和/或錯誤計算。

            //在Eclipse中運行沒有出現(xiàn)錯誤!
            //在Visual Studio中運行出現(xiàn)運行時錯誤!
            int ival;    //沒有初始化!
            std::cout<<ival<<std::endl;

            6、聲明和定義

            為了能讓多個文件訪問相同的變量,C++區(qū)分了聲明和定義。簡單地說就是可以用extern關(guān)鍵字來聲明,任何有分配內(nèi)存行為的聲明都是定義。定義也是聲明。聲明:標(biāo)明變量的類型和名字;定義:為變量分配存儲空間,還可以為變量指定初始值。

            舉例說明:

            extern double pi; //聲明
            double pi; //定義,聲明了pi同時定義了pi
            extern double pi = 3.14159; //定義,因為它為pi分配了初值。只有當(dāng)該extern語句
                 位于函數(shù)外部的時候才允許使用初始化式,否則將導(dǎo)致編譯錯誤。

            7、變量的隱藏:

            std::string s1 = "I am a std::string!";
            std::cout<<s1<<std::endl;
            for(int s1=3; s1!=0; --s1)
            std::cout<<"I am a number(int):"<<s1<<std::endl;

            提示:在Visual Studio 2008中使用std::string定義一個變量,再通過std::cout將其輸出,將會得到“error C2679: 二進制“<<”: 沒有找到接受“std::string”類型的右操作數(shù)的運算符(或沒有可接受的轉(zhuǎn)換)”錯誤信息,這時要檢查頭文件中是否包含#include <string>。而在Eclipse中則不用如此設(shè)置(具體看編譯器版本)。這與標(biāo)準(zhǔn)庫實現(xiàn)的具體細節(jié)有關(guān),在MSVC中,它在文件Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\string中被實現(xiàn),在GNU中,它在base_string.h中被實現(xiàn)。在使用std::string時,總是包含#include <string>是一個好習(xí)慣!

            8、const對象默認為文件的局部變量

            一般聲明變量后可以在其它文件中通過extern關(guān)鍵字聲明并使用該變量:

            //文件1:
            int counter;
            //文件2:
            extern int counter;
            ++counter;

            但是如果是const則無法訪問。可以通過顯式指定extern關(guān)鍵字使其成為全局可訪問對象:

            //文件1:
            extern const int bufSize = getBufSize();
            //文件2:
            extern count int bufSize;
            //……使用bufSize

            注解:非const變量默認為extern。要使const變量能夠在其他的文件中訪問,必須顯式地指定它為extern。

            9、引用

            int ival = 1024;
            int &refVal = ival;

            當(dāng)引用初始化后,只要該引用存在,就保持綁定到初始化時指向的對象。不可能將引用綁定到另一個對象。

            也正因為如此,所以引用比指針的優(yōu)勢就在于:引用不可以在方法中篡改,這使得方法變量變得安全了。

            10、const引用

            const int ival = 1024;
            const int &refVal = ival;

            這里我們要求左側(cè)的類型是一致的,包括const!

            非const引用只能綁定到與該引用同類型的對象。
            const引用則可以綁定到不同但相關(guān)的類型的對象或綁定到右值。(具體示例詳見C++Primer v4 P52)

            例如:

            //錯誤代碼
            double dval = 3.14;
            const int &ri = dval;

            編譯器會將這些代碼轉(zhuǎn)換成如以下形式的編碼:

            int temp = dval;
            const int &ri = temp;
            如果ri不是const,那么可以給ri賦一新值。這樣做不會修改dval,而是修改了temp。期望對ri的賦值會修改dval的程序員會發(fā)現(xiàn)dval并沒有被修改。僅允許const引用綁定到需要臨時使用的值完全避免了這個問題,因為const引用是只讀的。
             

            但是如下代碼可以執(zhí)行:

            int ival = 1024;
            const int &refVal = ival;
            ++ival;
            //++refVal;    //error C3892: “refVal” 不能給常量賦值
            std::cout<<"ival="<<ival<<"\trefVal="<<refVal<<std::endl;

            輸出:ival=1025    refVal=1025

            const double dval = 3.14;
            const int &ri = (int)dval;
            std::cout<<ri<<std::endl;
            輸出:3

            posted on 2008-12-19 17:52 volnet 閱讀(2908) 評論(6)  編輯 收藏 引用 所屬分類: C++ Primer 學(xué)習(xí)筆記

            評論

            # re: C++ notes (1) 2008-12-20 13:54 9278

            看完第一句就知道copy的哪本書了 噢也!  回復(fù)  更多評論   

            # re: C++ notes (1) 2008-12-20 13:56 volnet

            @9278
            從所屬分類也可以判斷~恭喜樓上!   回復(fù)  更多評論   

            # re: C++ notes (1) 2008-12-21 16:11 永恒白天

            不讓你使用 下劃線 的原因是標(biāo)準(zhǔn)規(guī)定說這些都是預(yù)留給編譯器用的  回復(fù)  更多評論   

            # re: C++ notes (1) 2008-12-21 16:41 volnet

            @永恒白天
            所以那句話翻譯或者表達不好,怎么能說“不能”二字!呵呵  回復(fù)  更多評論   

            # re: C++ notes (1) 2009-03-13 19:08 sinor51

            不說:“不能”,您認為應(yīng)該翻譯成什么呢?  回復(fù)  更多評論   

            # re: C++ notes (1) 2009-03-13 19:15 volnet

            @sinor51
            可以說“不應(yīng)該”,不能一般是指編譯會出錯吧  回復(fù)  更多評論   

            特殊功能
             
            日本精品久久久中文字幕| 亚洲国产精品无码久久| 天天久久狠狠色综合| 88久久精品无码一区二区毛片 | 久久精品午夜一区二区福利 | 青青草原1769久久免费播放| 国产成人99久久亚洲综合精品| 国内精品久久久久久久久电影网| 久久99精品久久久久久不卡| 97久久精品午夜一区二区| 无码久久精品国产亚洲Av影片| 狠狠色丁香久久婷婷综| 久久久久99精品成人片直播| 99热热久久这里只有精品68| 亚洲国产精品无码久久| 久久综合伊人77777| 三级片免费观看久久| 国产亚洲美女精品久久久| 国产亚洲精品久久久久秋霞| 999久久久国产精品| 亚洲精品美女久久777777| 久久精品国产99久久丝袜| 久久婷婷五月综合97色直播| 国产成人久久精品激情| 久久综合狠狠色综合伊人| 亚洲精品美女久久久久99| 三级三级久久三级久久| 亚洲午夜久久久影院伊人| 亚洲午夜精品久久久久久浪潮| 无码任你躁久久久久久老妇App| yellow中文字幕久久网| 国产精品久久久久影院色| 久久精品国产亚洲AV无码偷窥| 久久WWW免费人成一看片| 77777亚洲午夜久久多喷| 亚洲va久久久噜噜噜久久男同| 亚洲精品国产综合久久一线| 色8激情欧美成人久久综合电| 怡红院日本一道日本久久| 久久久久婷婷| 武侠古典久久婷婷狼人伊人|