面向?qū)ο缶幊碳夹g(shù)與方法 課件 第2章 C++編程基礎(chǔ)_第1頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第2章 C++編程基礎(chǔ)_第2頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第2章 C++編程基礎(chǔ)_第3頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第2章 C++編程基礎(chǔ)_第4頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第2章 C++編程基礎(chǔ)_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

面向?qū)ο缶幊碳夹g(shù)與方法(C++)

第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)第2章

C++編程基礎(chǔ)

2.1C++的詞法規(guī)則

2.1.1字符集

2.1.2單詞

2.2C++的數(shù)據(jù)類型

2.2.1基本數(shù)據(jù)類型

2.2.2常量與變量

2.2.3自定義數(shù)據(jù)類型

2.2.4擴(kuò)展數(shù)據(jù)類型

2.2.5類型轉(zhuǎn)換

2.2.6typedef與typeid 2.3表達(dá)式與語句

2.3.1表達(dá)式

2.3.2語句

2.4預(yù)處理命令

2.4.1宏定義命令

2.4.2文件包含命令

2.4.3條件編譯命令

2.5名字空間

2.5.1名字空間聲明

2.5.2使用名字空間

2.5.3標(biāo)準(zhǔn)名字空間std 2.6小結(jié)第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則

2.2C++的數(shù)據(jù)類型

2.3表達(dá)式與語句

2.4預(yù)處理命令

2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則—字符集、單詞2.1.1字符集

大小寫的英文字母:A~Z,a~z

數(shù)字字符:0~9

特殊字符:基本ASCII碼是美國標(biāo)準(zhǔn)信息交換碼,把128個字符與7位二進(jìn)制數(shù)碼對應(yīng)。C++把字符和它的碼值同等看待,字符對應(yīng)的數(shù)值就是該字符的ASCII碼。參見例2-1。運(yùn)行結(jié)果:

ch=Aa=65第2章C++編程基礎(chǔ)2.1.2單詞

關(guān)鍵字:預(yù)定義的單詞,表達(dá)特定的含義,不允許重定義標(biāo)識符:是程序員聲明的單詞,例如函數(shù)名、類名、對象名等。要求:1)以字母或者下劃線開始;2)由字母、數(shù)字或者下劃線組成。區(qū)分大/小寫,且不能使用預(yù)定義的關(guān)鍵字。運(yùn)算符:如+、-、*、/等。是預(yù)定義的函數(shù)的名字。分隔符:用于分割各個單詞或者程序正文。如:空格、制表、換行、逗號、冒號、分號、圓括號、花括號、注釋符等。文字:在程序中直接表示常量值,包括數(shù)字、字符、字符串和布爾文字。第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則

2.2C++的數(shù)據(jù)類型

2.3表達(dá)式與語句

2.4預(yù)處理命令

2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型基本數(shù)據(jù)類型,或稱為內(nèi)置數(shù)據(jù)類型,包括:布爾型(bool)、字符型(char)、整型(int)、浮點(diǎn)型(float,double)、空類型(void)??捎胹igned、unsigned修飾字符型和整型,long可用來修飾整型和雙精度浮點(diǎn)型,short可以修飾整型。用戶自定義數(shù)據(jù)類型:在基本數(shù)據(jù)類型或者已定義的數(shù)據(jù)類型基礎(chǔ)上,用戶根據(jù)自己的需要,構(gòu)造出的新類型。如:枚舉、聯(lián)合、結(jié)構(gòu)、類等。將數(shù)據(jù)與操作數(shù)據(jù)的算法/函數(shù)封裝在一起所建立的類型,被稱作抽象數(shù)據(jù)類型,即類類型。擴(kuò)展數(shù)據(jù)類型:在已定義的數(shù)據(jù)類型基礎(chǔ)上,結(jié)合某些修飾符(如[]、*、&、())或者關(guān)鍵字(如const),可以得到擴(kuò)展數(shù)據(jù)類型,如數(shù)組、指針、引用等。第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型

2.2.1基本數(shù)據(jù)類型

2.2.2常量與變量 2.2.3自定義數(shù)據(jù)類型 2.2.4擴(kuò)展數(shù)據(jù)類型 2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.1基本數(shù)據(jù)類型 布爾型(bool),或邏輯型,占用1個字節(jié),其值只能是真(true)或假(false)兩種情況,一般用“1”表示true,用“0”表示false字符型(char),表示單個ASCII字符或者相應(yīng)的整數(shù)值,占用1個字節(jié),在內(nèi)存中以ASCII碼值的形式存儲。整型(int),修飾符short、long、signed、unsigned浮點(diǎn)型(float,double),即實(shí)數(shù),單精度、雙精度和長雙精度空類型(void),表示函數(shù)無返回值、或指針?biāo)笇ο蟮念愋筒幻鞔_第2章C++編程基礎(chǔ)基本數(shù)據(jù)類型所占用的內(nèi)存情況參見表2-3。第2章C++編程基礎(chǔ)可以通過運(yùn)算符sizeof,測試在自己的機(jī)器環(huán)境下某種數(shù)據(jù)類型或?qū)ο笏加玫膬?nèi)存大小。第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型

2.2.2常量與變量

2.2.3自定義數(shù)據(jù)類型 2.2.4擴(kuò)展數(shù)據(jù)類型 2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.2常量與變量 1.文字常量:在程序運(yùn)行過程中,其值不可改變。包括:文字、宏定義的符號常量、const常量等。變量:在程序運(yùn)行過程中,其值可以改變。布爾文字,true,false整型文字,例如,-1000L表示長整數(shù),1000UL表示無符號長整數(shù),U和L不分前后。八進(jìn)制表示0767L,十六進(jìn)制表示0x76fL等。浮點(diǎn)型文字,12.5,.65F,2.5E-3,1e+5F,.28E12L字符文字,(1)‘A’,‘4’;(2)用八進(jìn)制或十六進(jìn)制的ASCII碼值表示:如‘A’又可以表示為‘\101’,或者‘\x41’;(3)如‘\n’表示換行符,參見表2-4。字符串文字,‘’a‘’,‘‘book’’,以字符‘\0’結(jié)尾。因此,字符'a'占一個字節(jié),而字符串''a''占兩個字節(jié)。第2章C++編程基礎(chǔ)2.2.2常量與變量 2.變量與對象變量(或?qū)ο螅┮话憔哂忻Q(通過new創(chuàng)建的對象沒有名稱)、類型、數(shù)值、地址這四個要素。定義變量時,系統(tǒng)會在內(nèi)存中為該變量分配一塊連續(xù)區(qū)域,變量的地址就是該區(qū)域的首地址。C語言習(xí)慣使用“變量”這個術(shù)語。C++中的對象,強(qiáng)調(diào)的是分配好的、具體的一塊內(nèi)存區(qū)域,并且具有唯一的地址。每個對象都與一個特定的數(shù)據(jù)類型相關(guān)聯(lián),這個類型決定了相關(guān)內(nèi)存的大小、布局、能夠存儲在該區(qū)域的值的范圍以及可以對該區(qū)域進(jìn)行哪些操作等。數(shù)據(jù)類型不僅包括基本數(shù)據(jù)類型,更重要的是抽象數(shù)據(jù)類型。第2章C++編程基礎(chǔ)2.變量與對象--對象的聲明和定義標(biāo)識符(如對象名、類名、函數(shù)名等)在使用之前要先進(jìn)行聲明或定義。聲明是告訴編譯器“這個標(biāo)識符在某處進(jìn)行了定義”。定義是說“在這里創(chuàng)建對象、函數(shù)等”,并分配相應(yīng)的存儲空間。多數(shù)情況下對象聲明也就是定義(對全局對象進(jìn)行extern聲明時例外)。

floatf1,f2,f3,f4;floatf=2.5;或者floatf(2.5);類對象通過調(diào)用構(gòu)造函數(shù)進(jìn)行初始化。2.2.2常量與變量 第2章C++編程基礎(chǔ)2.變量與對象--標(biāo)識符的作用域和可見性①作用域指標(biāo)識符在程序正文中的有效范圍,例如程序塊域、函數(shù)域、類域、名字空間域、文件域等??梢娦杂懻摰氖菢?biāo)識符能否被使用。在具有包含關(guān)系的局部作用域中,同名的內(nèi)層對象將屏蔽外層對象,這時外層對象的標(biāo)識符是不可見的。在同一作用域中不能對同一個標(biāo)識符多次定義。2.2.2常量與變量 第2章C++編程基礎(chǔ)2.變量與對象--標(biāo)識符的作用域和可見性②在函數(shù)、類等之外定義的對象,默認(rèn)情況下的作用范圍具有全局性,即在整個程序運(yùn)行期間起作用,所以稱之為全局對象。在局部作用域內(nèi),同名的局部對象將屏蔽全局對象。如果想在局部作用域內(nèi)使用全局對象,則應(yīng)利用作用域運(yùn)算符“::”。參見例2-4。如果一個程序包含多個編譯單元,那么在一個編譯單元中定義的全局對象,不僅在該編譯單元可用,在其他編譯單元也可以使用,但要先進(jìn)行extern聲明。參見例2-5。對于包含多個編譯單元的程序,如果想使全局對象只在定義它的編譯單元中起作用,則可以在定義時聲明它為static。參見例2-6。2.2.2常量與變量 第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)2.變量與對象—對象的生存期程序中的對象,一般在需要時被創(chuàng)建,不需要時則從內(nèi)存中刪除。在創(chuàng)建和刪除之間所經(jīng)歷的時間稱為對象的生存期。一般,局部對象的生存期與它的作用域同在,全局對象的生存期與程序的整個執(zhí)行過程同在。如果想使一個對象在整個程序執(zhí)行過程中都存在,同時又不希望像全局對象那樣存在安全隱患,這時可聲明static局部對象。聲明靜態(tài)局部對象時,一般要進(jìn)行初始化。參見例2-7。2.2.2常量與變量 第2章C++編程基礎(chǔ)運(yùn)行結(jié)果:

4,

5第2章C++編程基礎(chǔ)關(guān)于作用域與生存期的總結(jié):一般局部對象的作用域從對象的定義點(diǎn)開始,到它所在的程序塊結(jié)束為止;生存期與作用域同在。靜態(tài)局部對象的作用域與一般局部對象相同;生存期與整個程序同在。一般全局對象在程序的任意地方都可以使用;生存期與整個程序同在。靜態(tài)全局對象具有文件作用域;生存期與整個程序同在。用new建立的堆對象,其作用域和生存期由用戶確定。第2章C++編程基礎(chǔ)2.變量與對象—對象的存儲定義對象時,auto、register、static、extern是影響對象存儲類型的幾個關(guān)鍵字。存儲區(qū)域類型:(1)靜態(tài)存儲區(qū),全局對象、靜態(tài)對象和函數(shù)一般存儲于該區(qū)域,存儲區(qū)在程序開始執(zhí)行之前分配,在程序的整個運(yùn)行期間都存在。(2)棧區(qū)(stack),程序執(zhí)行期間進(jìn)行內(nèi)存分配。一般局部變量存于棧區(qū)。(3)堆區(qū)(heap),也稱為動態(tài)存儲區(qū)。程序運(yùn)行時用new申請內(nèi)存,由程序員負(fù)責(zé)何時用delete釋放內(nèi)存。不同存儲類型的對象,被分配在不同的內(nèi)存區(qū)域參見例2-8。2.2.2常量與變量 第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)3.常量在C++標(biāo)準(zhǔn)化之前,當(dāng)需要用符號表示常量時,常用#define宏命令來定義,例如:

#definePI3.14159標(biāo)準(zhǔn)C++中用const定義常量,與定義變量的語法類似,只是在前面多了一個關(guān)鍵字const。

constdoublepi=3.14159;常量必須進(jìn)行初始化,而且常量的值不能改變。全局const量,默認(rèn)具有文件作用域,這一點(diǎn)與一般全局對象不同。如果想使一個const在整個程序可用,那么定義時就要帶extern聲明。2.2.2常量與變量 第2章C++編程基礎(chǔ)4.

volatilevolatile的語法與const類似。關(guān)鍵字const告訴編譯器“不要改變我”,而關(guān)鍵字volatile則告訴編譯器“我可能會改變”。當(dāng)編譯器不進(jìn)行優(yōu)化時,volatile不起作用;但當(dāng)優(yōu)化代碼時,用該關(guān)鍵字則可以防止出現(xiàn)錯誤。2.2.2常量與變量 第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型 2.2.2常量與變量

2.2.3自定義數(shù)據(jù)類型

2.2.4擴(kuò)展數(shù)據(jù)類型 2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.3自定義數(shù)據(jù)類型 在基本數(shù)據(jù)類型基礎(chǔ)上,用戶可以根據(jù)需要構(gòu)造出新的數(shù)據(jù)類型,如枚舉、聯(lián)合、結(jié)構(gòu)、類等,這些都可以稱為自定義數(shù)據(jù)類型。一旦定義了一種新的數(shù)據(jù)類型,我們就可以像使用int一樣使用這種新類型。第2章C++編程基礎(chǔ)1.枚舉枚舉類型是若干個有名字的整型常量的集合,如:

enumShape{CIRCLE=-10,SQUARE=0,RECTANGLE=10};花括號內(nèi)的標(biāo)識符是枚舉常量,之間用逗號分隔;枚舉常量的類型為Shape,具有整數(shù)值,可用來初始化或更新Shape類型的對象:

Shapesh=SQUARE;//對象sh初值為SQUAREsh=RECTANGLE;//sh值改為RECTANGLE枚舉常量的值,最前邊的一個默認(rèn)為為0,其后的值依次加1;枚舉常量的值也可顯式定義,未顯式定義的則在前一個值的基礎(chǔ)上加1,如下面BLACK值為0,GREEN值為1,RED值為5,YELLOW值為6:

enumColor{BLACK,GREEN,BLUE=4,RED,YELLOW}2.2.3自定義數(shù)據(jù)類型 第2章C++編程基礎(chǔ)2.聯(lián)合聯(lián)合類型對象的每個成員都存儲在同一位置,最大存儲空間的需要量由需要存儲空間最大的成員決定。2.2.3自定義數(shù)據(jù)類型

sizeof(A.a)=4 sizeof(A.b)=8 sizeof(A)=8union

UnionX

{ inta; doubleb;};UnionXA;//A為對象第2章C++編程基礎(chǔ)3.結(jié)構(gòu)結(jié)構(gòu)類型由其他類型的數(shù)據(jù)成員組成,如可以把學(xué)生的學(xué)號、姓名、年齡、成績等放在一起,定義一種結(jié)構(gòu)類型。2.2.3自定義數(shù)據(jù)類型

sizeof(A.a)=4 sizeof(A.b)=8 sizeof(A)=12struct

StructX{ inta; doubleb;};StructXA;//A為對象第2章C++編程基礎(chǔ)3.類在上面的結(jié)構(gòu)類型中,我們把不同類型的數(shù)據(jù)封裝在一起。那么對于使用這些數(shù)據(jù)的算法(一般通過函數(shù)實(shí)現(xiàn)),我們是否也能封裝到一起?通過關(guān)鍵字class,可以定義一種新的數(shù)據(jù)類型,即類,例如:2.2.3自定義數(shù)據(jù)類型第2章C++編程基礎(chǔ)struct與classstruct類型中也可以封裝成員函數(shù)。struct類型與class類型的區(qū)別是:默認(rèn)情況下class中的成員具有private訪問屬性,而struct中的成員具有public訪問屬性??梢园衙杜eenum、聯(lián)合union和結(jié)構(gòu)struct看作是類class的特殊情況。第2章C++編程基礎(chǔ)4.類模板為了減少程序員的重復(fù)勞動,對于功能相同而成員類型不同的類,允許聲明一個通用的類模板。通過類模板可以生成不同的類。第8章介紹類模板的定義與使用。C++標(biāo)準(zhǔn)庫為我們定義了很多可供直接使用的類(模板),如string、pair、complex、valarray、流類、容器類、迭代器等,使用時只要包含相應(yīng)的頭文件即可。2.2.3自定義數(shù)據(jù)類型第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型 2.2.2常量與變量 2.2.3自定義數(shù)據(jù)類型

2.2.4擴(kuò)展數(shù)據(jù)類型

2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.4擴(kuò)展數(shù)據(jù)類型在基本數(shù)據(jù)類型或者自定義數(shù)據(jù)類型基礎(chǔ)上,結(jié)合運(yùn)用修飾符(如[]、*、&、())或者關(guān)鍵字(如const),可以得到擴(kuò)展數(shù)據(jù)類型,如數(shù)組、指針、引用等。1.數(shù)組數(shù)組是數(shù)目固定、類型相同的若干個對象的有序集合,這些對象稱為數(shù)組的元素。數(shù)組定義形式:

類型數(shù)組名[維1][維2]…={{初值表},{初值表}…};inta[5]={2,1,3,5,6};intb[2][3]={{1,0,2},{3,6,5}};ClassXobj[2][3];第2章C++編程基礎(chǔ)數(shù)組元素的各維下標(biāo)都從0開始;數(shù)組名對應(yīng)數(shù)組的起始地址,是常量;而數(shù)組元素一般是變量;各元素在內(nèi)存中按下標(biāo)的升序連續(xù)存放,如:

inta[3];//a[0],a[1],a[2];元素個數(shù):sizeof(a)/sizeof(a[0])intb[2][2];//b[0][0],b[0][1],b[1][0],b[1][1]b[0]表示含2個元素b[0][0]、b[0][1]的一維數(shù)組,b[1]表示含2個元素b[1][0]、b[1][1]的一維數(shù)組使用數(shù)組時,不能對數(shù)組名進(jìn)行直接拷貝和比較。如果想把一個數(shù)組拷貝到另一個中去,可以采用拷貝每個元素的方法。見例2-11。C++沒有提供對數(shù)組元素下標(biāo)進(jìn)行范圍檢查的手段。采用標(biāo)準(zhǔn)庫中的容器vector,可以生成類似數(shù)組的對象,且能夠進(jìn)行拷貝、自動調(diào)整大小等。參見例2-12。運(yùn)行結(jié)果:

0.5第2章C++編程基礎(chǔ)2.2.4擴(kuò)展數(shù)據(jù)類型2.指針指針是指能夠存放對象地址的對象。一個類型為T*的指針能夠保存T類型對象的地址。指針本身也是一個對象,占據(jù)一定的內(nèi)存空間,具有自己的名字、值和地址。不同的是,指針的值是所指對象的地址,因此我們常說某指針“指向”某個對象。

例如:

inta=102;

int*

pa=&a;可以通過指針修改它所指向的對象的值。如:*pa=100;//通過pa修改a的值也可以定義指向類對象的指針,例如:

ClassXobj; ClassX*p=&obj;雖然在聲明指針時可以不進(jìn)行初始化,但這樣的指針是懸空的,使用時容易出現(xiàn)錯誤。因此應(yīng)該養(yǎng)成定義時進(jìn)行初始化的習(xí)慣。第2章C++編程基礎(chǔ)指針與數(shù)組在C++程序中,數(shù)組名對應(yīng)數(shù)組的起始地址,數(shù)組名和指針名經(jīng)??梢曰Q使用。參見例2-13。但是,數(shù)組和指針是不同的。數(shù)組名所指內(nèi)存區(qū)的地址和容量在數(shù)組生命期內(nèi)是不變的??捎胹izeof(數(shù)組名)算出數(shù)組所占的字節(jié)數(shù)。而指針一般是變量,可以指向類型匹配的任意對象(即不同的內(nèi)存區(qū))。我們無法知道指針?biāo)竷?nèi)存區(qū)的大小,如用sizeof(指針名),得到的是指針本身所占的字節(jié)數(shù),而不是所指內(nèi)存的字節(jié)數(shù)。也可以定義元素為指針的數(shù)組,稱為指針數(shù)組:

doublef1=1.8,f2=2.8; double*p[2]={&f1,&f2};

第2章C++編程基礎(chǔ)指向常量的指針與常量型指針①定義指針時,如用關(guān)鍵字const修飾所指對象的數(shù)據(jù)類型,這時的指針就稱為指向常量的指針。指向常量的指針可以保存變量或者常量的地址,并且限制指針的訪問方式為“只讀”,即不能通過指針修改所指對象的值。 intv1=3; //變量v1 constintmax=100; //常量max,初始化! constint*p1=&v1;//指向常量的指針

*p1=5; //錯誤! p1=&max; //將常量max的地址賦給p1 *p1=10; //錯誤!第2章C++編程基礎(chǔ)指向常量的指針與常量型指針②定義指針時,如果在指針名前加關(guān)鍵字const修飾,則該指針是常量型指針。常量型指針必須進(jìn)行初始化,然后指針的值不再改變,即指針的指向不變。但如果常量型指針?biāo)傅氖亲兞?,則可以通過該指針修改所指變量的值。intv1=10,v2=20; //兩變量constintmax=100; //常量maxint*constpv1=&v1; //常量型指針指向v1pv1=&v2; //錯誤!指向不能再改變*pv1=v2; //正確!int*constpv2=&max;//錯誤!第2章C++編程基礎(chǔ)指向常量的指針與常量型指針③定義指針時,如果對數(shù)據(jù)類型和指針名都用了關(guān)鍵字const修飾,則這樣的指針稱為指向常量的常量型指針。這意味著定義之后,指針的值和所指對象的值都不能改變。 intv1=10,v2=20; //兩個變量 constintmax=100; //常量max constint*constpv1=&v1; constint*constpv2=&max; pv1=&v2; //錯誤!

*pv1=v2; //錯誤!第2章C++編程基礎(chǔ)2.2.4擴(kuò)展數(shù)據(jù)類型3.引用引用可以理解為對象的別名,其聲明形式如下:

數(shù)據(jù)類型&引用名=被引用的對象名; intm=0;

int&n=m;//n是int型變量m的引用 n=n+5;//結(jié)果m=5 ClassXobj;

ClassX&newname=obj; 聲明引用時必須進(jìn)行初始化,初值一般必須是對象名;const引用也可用常量或表達(dá)式的值初始化。引用一旦被初始化,就不能再指代其他對象。不過一個對象可以有多個引用。

第2章C++編程基礎(chǔ)2.2.4擴(kuò)展數(shù)據(jù)類型引用和指針的區(qū)別指針用來保存對象的地址,引用相當(dāng)于對象的別名;聲明指針時要分配內(nèi)存(引用型除外),而聲明引用時不分配內(nèi)存;聲明引用時必須初始化,聲明指針時可以不初始化;指針可作數(shù)組元素,引用不能作數(shù)組元素;可以有指向void型的指針,而沒有void型引用;可以聲明指針的引用,而沒有指向引用的指針。

第2章C++編程基礎(chǔ)2.2.4擴(kuò)展數(shù)據(jù)類型引用和指針的區(qū)別 intm1=0,m2=5; int*p1=&m1; //p1指向m1

int*&p2=p1; //p2是指針p1的引用,也指向m1 *p2=m2; //將m2的值5賦給p2所指向的對象即m1 int&n1=m1; //n1是m1的引用 int&*n2=n1; //錯誤!

第2章C++編程基礎(chǔ)2.2.4擴(kuò)展數(shù)據(jù)類型4.字符串字符串是若干有效字符的序列。字符串常量由雙引號括起來,如"x+y=10"。字符串可以放在一個字符數(shù)組中,結(jié)束位置用符號‘\0’表示。定義字符數(shù)組時,可以逐個字符初始化,也可以用一個字符串常量初始化。例如: charstr1[]={'x','+','y','=','1','0','\0'}; charstr2[]="x+y=10"; //數(shù)組含7個元素

第2章C++編程基礎(chǔ)可以通過指向字符的指針管理字符串,例如:

charstr1[]={'x','+','y','=','1','0','\0'};char*cp=str1;//cp保存字符串str1的起始地址對字符指針可以用字符串常量初始化,但不能以數(shù)組元素形式初始化,因?yàn)閏p只存放一個地址值。例如:

char*cp1="x+y=10"; //cp1保存串的起始地址

char*cp2={'x','+','y','=','1','0','\0'};//錯誤!定義字符串時,最好使用標(biāo)準(zhǔn)庫中的類string,該類封裝了字符串的基本特性和各種典型操作,如賦值、連接、比較、查找等。參見例2-14。第2章C++編程基礎(chǔ)運(yùn)行結(jié)果:x+y=10,size=6第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型 2.2.2常量與變量 2.2.3自定義數(shù)據(jù)類型 2.2.4擴(kuò)展數(shù)據(jù)類型

2.2.5類型轉(zhuǎn)換

2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.5類型轉(zhuǎn)換1.隱式轉(zhuǎn)換隱式轉(zhuǎn)換由編譯器自動完成,運(yùn)算規(guī)則是從低類型向高類型提升。從高類型向低類型轉(zhuǎn)換會給出警告。inta=3.541+3;//結(jié)果a的值為6C++可以將某種指針類型(指向非const型)自動轉(zhuǎn)換成void*型,反過來則不行。inta=0;int*p1=&a;void*pv=p1;//OK.隱式轉(zhuǎn)換int*p2=pv;//錯誤!void*不能隱式轉(zhuǎn)換成int*constint*pci=&a;pv=pci;//錯誤!constint*不能隱式轉(zhuǎn)換成void*第2章C++編程基礎(chǔ)2.2.5類型轉(zhuǎn)換2.顯式轉(zhuǎn)換顯式轉(zhuǎn)換一般要通過類型轉(zhuǎn)換運(yùn)算符強(qiáng)制實(shí)現(xiàn)類型轉(zhuǎn)換,因此也稱為強(qiáng)制轉(zhuǎn)換??梢酝ㄟ^強(qiáng)制類型轉(zhuǎn)換運(yùn)算符實(shí)現(xiàn)類型的顯式轉(zhuǎn)換:

inta=1;doubleb=3.1415;a=(int)b; //C風(fēng)格的顯式轉(zhuǎn)換

a=int(b); //早期C++風(fēng)格的顯式轉(zhuǎn)換標(biāo)準(zhǔn)C++顯式轉(zhuǎn)換方式:

static_cast<T>(Expr);const_cast<T>(Expr);dynamic_cast<T>(Expr);reinterpret_cast<T>(Expr);第2章C++編程基礎(chǔ)2.2.5類型轉(zhuǎn)換用戶定義的轉(zhuǎn)換轉(zhuǎn)換構(gòu)造函數(shù)可以將某種類型的對象轉(zhuǎn)換成當(dāng)前類類型。類型轉(zhuǎn)換函數(shù)可以將當(dāng)前類型的對象轉(zhuǎn)換成指定的類型。typedef可以為某種數(shù)據(jù)類型聲明一個新名字。使用運(yùn)算符typeid可以得到一個對象的數(shù)據(jù)類型。第2章C++編程基礎(chǔ)運(yùn)行結(jié)果:classClassXclassClassXdouble第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則

2.2C++的數(shù)據(jù)類型

2.3表達(dá)式與語句

2.4預(yù)處理命令

2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.3表達(dá)式與語句2.3.1表達(dá)式:由運(yùn)算符和操作數(shù)組成,按一定求值規(guī)則我們可以求出表達(dá)式的值;其中操作數(shù)可以是常量、變量或另一個表達(dá)式。算術(shù)運(yùn)算符與表達(dá)式;關(guān)系運(yùn)算符與表達(dá)式;邏輯運(yùn)算符與表達(dá)式;位運(yùn)算符與表達(dá)式;賦值運(yùn)算符與表達(dá)式;三元條件運(yùn)算符與表達(dá)式;逗號運(yùn)算符與表達(dá)式;動態(tài)內(nèi)存分配與釋放運(yùn)算符2.3.2語句:程序由語句組成,語句以“;”結(jié)束。

簡單語句,復(fù)合語句,控制語句(選擇語句、循環(huán)語句、跳轉(zhuǎn)語句),判斷表達(dá)式的使用第2章C++編程基礎(chǔ)2.3.1表達(dá)式根據(jù)功能,運(yùn)算符可分為算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符及特殊運(yùn)算符。根據(jù)所需操作數(shù)的個數(shù),運(yùn)算符可分為一元運(yùn)算符、二元運(yùn)算符和三元運(yùn)算符。一元運(yùn)算符只需要一個操作數(shù),二元運(yùn)算符需要兩個操作數(shù),三元運(yùn)算符則需要三個操作數(shù),C++只有一個三元運(yùn)算符即“?:”。一個表達(dá)式可以包含多個運(yùn)算符,運(yùn)算順序由各運(yùn)算符的優(yōu)先級和結(jié)合性決定。C++運(yùn)算符的功能和優(yōu)先級參見表2-5。第2章C++編程基礎(chǔ)2.3.1表達(dá)式算術(shù)表達(dá)式由算術(shù)運(yùn)算符和操作數(shù)組成,結(jié)果是算術(shù)值,值的類型與操作數(shù)的類型有關(guān)?;舅阈g(shù)運(yùn)算符:二元算術(shù)運(yùn)算符如+、-、*、/、%(int型);一元算術(shù)運(yùn)算符如-(取負(fù))、+(取正)等。其中一元運(yùn)算符優(yōu)先級高于二元運(yùn)算符。++和--,是兩個一元運(yùn)算符,操作數(shù)必須是變量,分前綴和后綴,優(yōu)先級較高,結(jié)合性自右向左。1.算術(shù)運(yùn)算符與表達(dá)式第2章C++編程基礎(chǔ)前綴“++”可以理解為“先增1后使用”,而前綴“--”可以理解為“先減1后使用”。后綴“++”可以理解為“先使用后增1”,后綴“--”可以理解為“先使用后減1”。

inta1=1,c1=0;

c1=++a1; //a1=a1+1;c1=a1;inta2=1,c2=0;

c2=a2++; //c2=a2;a2=a2+1;前綴方式與后綴方式的區(qū)別:第2章C++編程基礎(chǔ)2.3.1表達(dá)式關(guān)系表達(dá)式由關(guān)系運(yùn)算符和操作數(shù)組成,用來對兩個操作數(shù)進(jìn)行比較,結(jié)果為bool類型的值。如果關(guān)系為真,則結(jié)果為true;如果關(guān)系為假,則結(jié)果為false。關(guān)系運(yùn)算符包括:等于(==),不等于(!=),小于(<),小于等于(<=),大于(>),大于等于(>=)。后四種的優(yōu)先級高于前兩種。例如:設(shè)a=1,b=2,則表達(dá)式(a>b)的值為false,表達(dá)式(a<2)的值為true。2.關(guān)系運(yùn)算符與表達(dá)式第2章C++編程基礎(chǔ)2.3.1表達(dá)式邏輯表達(dá)式由邏輯運(yùn)算符和操作數(shù)組成,結(jié)果為bool類型的值。邏輯運(yùn)算符包括:邏輯或(||)、邏輯與(&&)和邏輯非(!)“邏輯或”表示當(dāng)兩個操作數(shù)只要其中一個為真,結(jié)果就為true;“邏輯與”表示當(dāng)兩個操作數(shù)都為真時,結(jié)果才為true;“邏輯非”表示取操作數(shù)的邏輯相反值。參見表2-6。3.邏輯運(yùn)算符與表達(dá)式第2章C++編程基礎(chǔ)2.3.1表達(dá)式位運(yùn)算表達(dá)式由位運(yùn)算符和操作數(shù)組成,可以對整型數(shù)按二進(jìn)制位進(jìn)行操作。位運(yùn)算符包括:按位或(|),按位異或(^),按位與(&),按位求反(~),左移(<<),右移(>>)?!鞍次划惢颉边\(yùn)算的規(guī)則是:對應(yīng)位不同為1,相同為0。例如:unsignedinta=8; //二進(jìn)制為00001000unsignedintc=a^10;//c=00000010unsignedintb=a<<1;//b=000100004.位運(yùn)算符與表達(dá)式第2章C++編程基礎(chǔ)2.3.1表達(dá)式賦值表達(dá)式由賦值運(yùn)算符與操作數(shù)組成,作用是將等號右邊表達(dá)式的值賦給等號左邊的對象,表達(dá)式值的類型與左邊對象的類型一致。是二元運(yùn)算符,結(jié)合性自右至左,優(yōu)先級僅高于逗號運(yùn)算符。簡單賦值(=),復(fù)合賦值(+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=)。例如:

a=b=5;//先將5賦給b,再賦給aa+=3; //等價于a=a+35.賦值運(yùn)算符與表達(dá)式第2章C++編程基礎(chǔ)2.3.1表達(dá)式C++唯一的一個三元運(yùn)算符是“?:”,具有簡單的選擇功能,其格式為:

a1?a2:a3其中a1具有bool類型,a2和a3可以是任何類型,表達(dá)式的類型取決于a2和a3中類型高的一個。上式的運(yùn)算過程是,若a1為true則表達(dá)式值為a2的值,否則表達(dá)式值為a3的值。例如求a和b中較大的值,并將該值賦給c,結(jié)果c的值為5:

inta=3,b=5,c=0;c=(a>b)?a:b;6.三元條件運(yùn)算符與表達(dá)式第2章C++編程基礎(chǔ)2.3.1表達(dá)式逗號也是一個運(yùn)算符,作用是將多個表達(dá)式連成一個表達(dá)式。計(jì)算時從左至右計(jì)算每一個表達(dá)式的值,逗號表達(dá)式的值與最后一個表達(dá)式的值相同。例如:

a=2*3,a*5;//表達(dá)式相當(dāng)于(a=2*3),a*5上述表達(dá)式中,逗號前面賦值表達(dá)式的值為6,a*5的值為30,則逗號表達(dá)式的值為30。逗號運(yùn)算符的優(yōu)先級最低,使用較少。7.逗號運(yùn)算符與表達(dá)式第2章C++編程基礎(chǔ)2.3.1表達(dá)式new運(yùn)算符建立動態(tài)對象,并分配內(nèi)存空間;delete運(yùn)算符刪除動態(tài)對象,即釋放內(nèi)存空間。new和delete必須配對使用。由new創(chuàng)建的堆對象沒有名字,只能通過地址進(jìn)行訪問,這一點(diǎn)與普通對象不同。例如:

int*p1=newint;int*p2=newint(10); int*p3=newint[10]; deletep1; deletep2; delete[]p3; 8.動態(tài)內(nèi)存分配與釋放運(yùn)算符第2章C++編程基礎(chǔ)2.3.2語句簡單語句:空語句,定義語句,表達(dá)式語句復(fù)合語句:多個簡單語句用一對花括號括住。控制語句:可以改變程序的流程。包括選擇語句(if-else,switch)循環(huán)語句(while,do-while,for)跳轉(zhuǎn)語句(break,continue,goto)第2章C++編程基礎(chǔ)2.3.2語句常用選擇語句包括if-else語句和switch語句。if-else語句的兩種形式(應(yīng)用參見例2-16):1.選擇語句第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)if-else語句嵌套使用可以實(shí)現(xiàn)多路分支,但比較繁瑣,而用switch語句比較簡單。語法:switch(表達(dá)式){ case常量表達(dá)式1:語句1;break; case常量表達(dá)式2:語句2;break; …… case常量表達(dá)式n:語句n;break; default:語句n+1;}第2章C++編程基礎(chǔ)2.3.2語句C++中可使用三種循環(huán)語句:while循環(huán)、do-while循環(huán)和for循環(huán)。2.循環(huán)語句第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)運(yùn)行結(jié)果:2550第2章C++編程基礎(chǔ)2.3.2語句跳轉(zhuǎn)語句包括break語句、continue語句和goto語句。由于goto語句存在較大的安全隱患,盡量不用。break語句可用于switch和循環(huán)結(jié)構(gòu)中,作用是退出switch或循環(huán)體。continue語句一般只能用于循環(huán)結(jié)構(gòu)中,作用是結(jié)束本次循環(huán),進(jìn)入下一次循環(huán)。3.跳轉(zhuǎn)語句運(yùn)行結(jié)果:10,12,14,16,18,2010第2章C++編程基礎(chǔ)2.3.2語句當(dāng)表達(dá)式值為非0,被認(rèn)為是true;只有當(dāng)表達(dá)式的值等于0時,才認(rèn)為是false。簡化代碼:如果表達(dá)式expr的值為布爾型、整型、指針值等,與0比較時都可以采用下列方式:expr 相當(dāng)于expr!=0 !expr 相當(dāng)于expr==0 if(a-b) 相當(dāng)于if((a-b)!=0)while(p&&!q)相當(dāng)于while(p!=0&&q==0)實(shí)數(shù)在計(jì)算和存儲時會有微小的誤差,因此一般不能用“==”或“!=”進(jìn)行判斷。應(yīng)設(shè)法轉(zhuǎn)化為“>=”和“<=”的形式。假設(shè)x為浮點(diǎn)型變量,則它與零值比較的if形式為:if((x>=-ε)&&(x<=ε))//ε為很小的正數(shù)

4.判斷表達(dá)式的使用第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則

2.2C++的數(shù)據(jù)類型

2.3表達(dá)式與語句

2.4預(yù)處理命令

2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.4預(yù)處理命令使用預(yù)處理命令的目的是為了改善程序的組織和管理。預(yù)處理命令以字符“#”開頭,它不是語句,后面不帶分號。下面介紹常用的預(yù)處理命令: 宏定義命令 文件包含命令 條件編譯命令第2章C++編程基礎(chǔ)2.4預(yù)處理命令2.4.1宏定義命令最簡單的宏定義命令是用一個標(biāo)識符代替另一種符號表示:

#definePI3.14159//定義宏P(guān)I C語言中常用這種方式定義宏常量,或者用帶參數(shù)的宏來描述簡單的函數(shù),例如:

#definef(x)2*x//定義帶參數(shù)的宏f(x)宏定義只是符號的簡單替換,在編譯之前執(zhí)行,不能進(jìn)行語法檢查,存在安全隱患。在C++中,用const定義常量、用inline定義內(nèi)嵌函數(shù)。#undef與#define配合使用,作用是取消宏定義

#undefPI //取消宏名PI第2章C++編程基礎(chǔ)2.4預(yù)處理命令2.4.2文件包含命令#include命令的作用是,在編譯之前把指定文件的內(nèi)容嵌入到該命令所在的位置。文件包含命令一般放在程序的開頭,例如:

#include<iostream>#include“myhead.h”其中,include為關(guān)鍵字,括號或引號中的文件名是被包含文件的全名,可以給出盤符和目錄路徑。上面第一種形式,一般用于C++系統(tǒng)提供的頭文件,這些文件存放在C++系統(tǒng)目錄下的include子目錄下。第二種形式,一般用于程序員自己建立的頭文件或其他源文件。第2章C++編程基礎(chǔ)2.4預(yù)處理命令2.4.3條件編譯命令條件編譯命令是用來限制某些內(nèi)容要在滿足一定條件時才參與編譯,否則不參與編譯。條件編譯命令的結(jié)構(gòu)與if選擇結(jié)構(gòu)非常相似。三種形式:形式一:若“標(biāo)識符”被定義過,則編譯程序段1;否則編譯程序段2,或者直接執(zhí)行#endif后面的程序。#ifndef

標(biāo)識符程序段1#else

程序段2#endif或者:#ifndef

標(biāo)識符程序段1#endif

形式二:若“標(biāo)識符”未被定義過,則編譯程序段1;否則編譯程序段2,或者直接執(zhí)行#endif后面的程序。

形式三:若常量表達(dá)式i(i=1,…,n)的值為真,則編譯程序段i;若所有表達(dá)式都為假,則編譯程序段n+1。形式三:

#if

常量表達(dá)式1

程序段1#elif

常量表達(dá)式2

程序段2 …#elif

常量表達(dá)式n

程序段n#else

程序段n+1#endif第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)避免重復(fù)包含://head1.h //如果沒有設(shè)置該文件被包含的標(biāo)志HEAD1_H//則設(shè)置該標(biāo)志,并且之后的代碼參與編譯#ifndefHEAD1_H #defineHEAD1_H

intaddint(inta,intb);//函數(shù)聲明doubled=0.8; //全局變量定義#endif//HEAD1_H第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則

2.2C++的數(shù)據(jù)類型

2.3表達(dá)式與語句

2.4預(yù)處理命令

2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.5名字空間雖然標(biāo)識符可以具有函數(shù)域、類域,可以通過static使函數(shù)和對象具有文件域,但全局性的對象名、函數(shù)名以及類名還在同一個全局名字空間中。一個大型軟件往往由多人完成,一旦對全局性的名字缺乏控制就會出現(xiàn)名字沖突。名字空間(namespace)是C++的新特性之一??梢园褋碜圆煌幊倘藛T的全局性標(biāo)識符歸屬不同的名字空間,從而解決程序開發(fā)中常見的同名沖突問題。名字空間聲明,使用名字空間,標(biāo)準(zhǔn)名字空間std。第2章C++編程基礎(chǔ)2.5名字空間2.5.1名字空間聲明namespacecalculator{ doubled=0.5; voidPrint(doublex){cout<<x<<endl;} classX{};//此處分號不能少!}//此處可以沒有分

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論