總第001篇
C++知識比較多,也比較亂剔桨,對于我們長期從事實戰(zhàn)開發(fā)的人員來說屉更,很多基礎知識很容易遺忘,自己看書復習又沒有那么多時間洒缀,即于此瑰谜,在接下來的三篇文章,概括講解C++編程知識精華树绩,旨在讓大家可以快速的復習和翻閱萨脑,讓開發(fā)更有效率。
1饺饭、C++基本結構
C++語言由頭文件與源文件組成渤早。
頭文件中包含:版權與版本信息、宏定義瘫俊、函數(shù)聲明和類的聲明鹊杖。宏定義為是了防止頭文件被重復引用。<>引用頭文件則直接在系統(tǒng)庫中查找頭文件军援;“ ”引用頭文件則先在當前工程目錄下查找仅淑,若工程目錄中不存在然后在系統(tǒng)庫中查找称勋。
源文件中包含:版權與版本信息胸哥,對頭文件的引用,系統(tǒng)功能代碼的實現(xiàn)赡鲜。用ifndef/define/endif結構產(chǎn)生預處理的宏定義塊空厌。類成員函數(shù)可以在類聲明中被定義,并且自動生成內聯(lián)函數(shù)银酬,這雖然會使書寫方便嘲更,但會造成風格上的不一致,因此建議頭文件中只存放聲明而不定義揩瞪。
頭文件的作用:a.很多時候不便公開頭文件代碼赋朦,用頭文件來調用庫功能,編譯器從庫中提取相應的代碼李破;b.頭文件能加強安全類型的檢查宠哄,如果接口實現(xiàn)錯誤會報錯,以便開發(fā)者調試嗤攻。
2毛嫉、C++基本要素
標識符:只能是字母、數(shù)字妇菱、下劃線組成承粤,且不能以數(shù)字開頭暴区。標識符在C++中區(qū)分大小寫,長度是任意的辛臊,一般前1024個是有意義的仙粱。C語言中一般前16個是有效的。
常量:在運行時不能被改變彻舰,在定義常量時可以設置初始值缰盏。對于常量,編譯器將其放置于一個只讀的存儲區(qū)域淹遵。
變量:在程序中可以被隨意賦值口猜,對于每一個變量都有兩個屬性:左值和右值。左值是指變量的地址值透揣,即存儲變量的內存地址济炎;右值是變量的數(shù)據(jù)值,即內存地址中存儲的數(shù)據(jù)辐真。
變量初始化的幾種形式如下圖:
3须尚、變量的存儲類型
變量的聲明是告知編譯器變量的名稱和數(shù)據(jù)類型,變量的定義是為變量分配存儲區(qū)域侍咱。使用extern只聲明而不定義變量耐床;若一個文件中聲明定義一個全局變量int var=0; 在另一個文件中聲明extern int var; 即可訪問此變量;
static存儲類型表示變量在函數(shù)或文件內的“持久性”楔脯,也稱為靜態(tài)變量撩轰,靜態(tài)變量可分為局部靜態(tài)變量和全局靜態(tài)變量。
局部靜態(tài)變量:函數(shù)內的變量用static修飾時昧廷,將被分配在持久的存儲區(qū)域堪嫂,當函數(shù)調用結束后并不釋放,保留其值以便下次調用木柬。局部靜態(tài)變量的作用域為當前函數(shù)皆串,不能被外界函數(shù)和文件訪問;
全局靜態(tài)變量:作用域僅限于當前定義的文件眉枕,不能被其它文件使用extern關鍵字訪問恶复;
使用register關鍵字,表示變量將被放置在CPU寄存器中速挑,訪問register變量要比訪問普通變量快得多谤牡,但 register只能用于局部變量或作為函數(shù)的形式參數(shù),不能用來定義全局變量梗摇。
變量有靜態(tài)存儲和動態(tài)存儲拓哟,全局變量和靜態(tài)變量是靜態(tài)存儲的,普通的局部變量是動態(tài)存儲的伶授,auto關鍵字表示變量動態(tài)存儲断序,默認情況下流纹,局部變量均屬于auto變量。
4违诗、數(shù)據(jù)類型
數(shù)值類型分為整型和實型漱凝,整型又分為有符號型和無符號型。下圖是各種類型及字節(jié)數(shù):
注意:兩個實數(shù)比較诸迟,盡量不要使用“==”或“茸炒!=”,而要使用“>=”或“<=”之類的運算符阵苇。因為用等于或不等于時壁公,若程序精度要求較高,可能產(chǎn)生未知的錯誤绅项,也可能產(chǎn)生未知的結果紊册。通常在比較實數(shù)時要定義實數(shù)的精度,在這個精度內來確定兩數(shù)的等或不等快耿。
字符類型:C++中用單引號來確定字符變量囊陡,用雙引號來確定字符串變量,字符是以ASCII的形式存儲的掀亥,因此可以直接將整數(shù)賦值給字符變量撞反。字符存儲用一個字節(jié)。
數(shù)組類型:數(shù)組的初始化要注意一些細節(jié)搪花,如下圖遏片。定義二維數(shù)組時,可以省略第一維的長度鳍侣,但不可以省略第二維的長度丁稀。
布爾類型:布爾類型和整數(shù)類型可以相互賦值
枚舉類型:枚舉類型是用int類型實現(xiàn)的,占用4個字節(jié)倚聚,定義格式為:enum<枚舉類型名>{常量1,常量2凿可,…}惑折,定義枚舉類型時可以為各常量提供一個整數(shù)值,默認情況第一個數(shù)為0枯跑,沒有定義的值應為前一個值加1惨驶。在定義函數(shù)時將函數(shù)參數(shù)設置為枚舉類型,這樣可以限制調用函數(shù)必須提供枚舉類型中的某個常量敛助,而不能隨意輸入一個整數(shù)粗卜。
結構體類型:定義格式為struct<結構體類型名>{結構體類型變量};? 若只要定義一次結構體類型變量,可以不寫結構體類型名稱纳击。訪問結構體成員用“.”续扔,兩個結構體變量可以直接賦值攻臀。
結構體空間分配問題:涉及字節(jié)對齊問題,即編譯器在為結構體變量分配空間時纱昧,保證下一個成員的偏移量應為該成員數(shù)據(jù)類型長度的整數(shù)倍刨啸。在開發(fā)應用程序時,有時要用一個字節(jié)表示多項內容识脆,這時就要用位域來訪問一位數(shù)據(jù)设联,如下代碼所示:
共用體提供了一種機制,使多個變量(共用體中的成員)可以共享同一個內存地址灼捂,各成員內存起始地址位置相同离例,每一瞬間只有一個成員起作用,起作用的成員是最后一次存放的成員悉稠。
指針是用來存放變量地址的粘招。通過變量訪問變量是直接訪問,通過指針訪問是間接訪問偎球。注意區(qū)分指針數(shù)組和數(shù)組指針洒扎,如下圖:
用const關鍵字來修飾指針的幾種情況:
引用即是目標的一個別名,操作引用與操作實際的目標對象是相同的衰絮。引用的定義格式如下:數(shù)據(jù)類型&引用名稱=目標對象
用typedef關鍵字可以自定義數(shù)據(jù)類型袍冷,它不是創(chuàng)建一個新的數(shù)據(jù)類型,而是為已有數(shù)據(jù)類型創(chuàng)建一個新的名稱猫牡,使用自定義類型可以提高程序的移植性胡诗。語法格式為:typedef 數(shù)據(jù)類型 新名稱 。
5淌友、運算符
異或有很強大的功能煌恢,通常用異或運算來實現(xiàn)二進位的反轉,也可用來實現(xiàn)兩個數(shù)的互換震庭。
任何數(shù)與0進行按位異或運算瑰抵,結果為數(shù)據(jù)本身;
變量與自身按位異或運算器联,結果為0二汛;
按位異或運算具有交換性,a^b^c=a^c^b=b^a^c拨拓;
用異或運算來交換兩個數(shù)的例子如下:
sizeof()用于返回變量肴颊、對象或數(shù)據(jù)類型的字節(jié)長度,在32位系統(tǒng)中渣磷,指針的長度為4字節(jié)婿着。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? END,下篇繼續(xù)!>顾巍提完!
本文首發(fā)于微信公眾號:實戰(zhàn)開發(fā)者⊥嗔颍可識別下方二維碼關注實戰(zhàn)開發(fā)氯葬。