C++編程全套課件_第1頁
C++編程全套課件_第2頁
C++編程全套課件_第3頁
C++編程全套課件_第4頁
C++編程全套課件_第5頁
已閱讀5頁,還剩613頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C/C++語言概述

1.1從C到C++的程序結(jié)構(gòu)

C++程序是由預(yù)處理命令、語句、函數(shù)、變量(對象)、輸入與輸出以及注釋等幾個基本部分組成的。#include<iostream.h>voidmain(){cout<<“Hello,world!!”<<endl;}1.1從C到C++的程序結(jié)構(gòu)代碼中的main表示主函數(shù),每一個C++程序都必須包含一個且只能包含一個main函數(shù)。main函數(shù)體是用一對花括號“{”和“}”括起來的.函數(shù)體中包括若干條語句,每一條語句都以分號“;”作為結(jié)束的標(biāo)志。C++用標(biāo)準(zhǔn)輸入輸出的頭文件iostream.h1.2程序書寫規(guī)范

標(biāo)識符命名

標(biāo)識符是用來標(biāo)識變量名、函數(shù)名、數(shù)組名、類名、對象名、類型名、文件名等的有效字符序列。標(biāo)識符命名需要遵守其合法性、有效性和易讀性的原則。

(1)合法性

C++規(guī)定標(biāo)識符由大小寫字母、數(shù)字字符(0~9)和下劃線組成,且第一個字符必須為字母或下劃線。 任何標(biāo)識符中都不能有空格、標(biāo)點(diǎn)符號、運(yùn)算符及其他非法字符。標(biāo)識符的大小寫是有區(qū)別的,并且不能和系統(tǒng)的關(guān)鍵字同名。關(guān)鍵字見課本p2想想為什么?1.2程序書寫規(guī)范(2)有效性

標(biāo)識符的長度最好不要超過32個,有的編譯系統(tǒng)只能識別前32個字符,前32個字符相同的兩個不同標(biāo)識符被有的系統(tǒng)認(rèn)為是同一個標(biāo)識符。

(3)易讀性 做到“見名知意”就可以達(dá)到易讀性的目的。許多程序員采用“匈牙利標(biāo)記法”來定義標(biāo)識符。1.2程序書寫規(guī)范縮進(jìn)和注釋縮進(jìn)和注釋非常重要,今后會反復(fù)強(qiáng)調(diào)。

程序在書寫時不要將程序的每一行都由第一列開始,應(yīng)在語句前面加進(jìn)一些空格,稱為“縮進(jìn)”,或是在適當(dāng)?shù)牡胤郊舆M(jìn)一些空行,以提高程序的可讀性。每個花括號占一行,并與使用花括號的語句對齊?;ɡㄌ杻?nèi)的語句采用縮進(jìn)書寫格式,縮進(jìn)量為四個字符(一個默認(rèn)的制表符)。1.2程序書寫規(guī)范注釋是為了提高程序的可讀性。注釋本身對編譯和運(yùn)行并不起作用。在程序中,凡是放在“/**/”之間或以“//”開頭行尾的內(nèi)容都是注釋的內(nèi)容,其中,/**/注釋方式可以出現(xiàn)在程序中的任何位置。一般來說,注釋應(yīng)在編程的過程中進(jìn)行,且注釋內(nèi)容一般有:源程序的總體注釋、函數(shù)注釋及其他的少量注釋。一般不要陳述那些一目了然的內(nèi)容,以免影響注釋的效果。1.3數(shù)據(jù)類型

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

C/C++的基本數(shù)據(jù)類型有字符型(char)、整型(int)和浮點(diǎn)型(float、double)三種。這些基本數(shù)據(jù)類型還可用short、long、signed和unsigned來修飾。見課本p4

需要注意的是:

(1)

C++可以有布爾型(bool),在計算機(jī)內(nèi),編譯系統(tǒng)將true表示成整數(shù)1,false表示成整數(shù)0,因此也可把布爾型看成是一個整型。

(2)

無符號(unsigned)和有符號(signed)的區(qū)別在于數(shù)值最高位的含義。有符號類型最高位是符號位,其余各位表示數(shù)值大??;無符號類型的各個位都用來表示數(shù)值大小;相同基本數(shù)據(jù)類型的signed和unsigned的數(shù)值范圍是不同。例如,無符號字符型值的范圍為0~255,有符號字符型值的范圍為-128~-127。1.3數(shù)據(jù)類型

(3)char、short、int和long可統(tǒng)稱為整型。默認(rèn)時,char、short、int和long本身是有符號(signed)的。1.3.2常量整型常量

整型常量可以用十進(jìn)制、八進(jìn)制和十六進(jìn)制來表示。十進(jìn)制整型常量即十進(jìn)制整數(shù);八進(jìn)制整型常量是以0開頭的數(shù);十六進(jìn)制整型常量是以0x或0X開頭的數(shù),它由0至9、A至F或a至f組成。

(0123,0x123,-0x11,0xb)

1.3數(shù)據(jù)類型注意:

(1)整型常量中的長整型(long)要以L或小寫字母l作為結(jié)尾。

(2)整型常量中的無符號型(unsigned)要以U或u作為結(jié)尾。浮點(diǎn)型常量

浮點(diǎn)型常量即實(shí)數(shù),它有十進(jìn)制數(shù)或指數(shù)兩種表示形式。十進(jìn)制數(shù)形式是由整數(shù)部分和小數(shù)部分組成的(注意必須有小數(shù)點(diǎn))。指數(shù)形式采用科學(xué)表示法,它能表示出很大或很小的浮點(diǎn)數(shù)。注意字母E(或e)前必須有數(shù)字,且后面的指數(shù)必須是整數(shù)。(345e+2,-3.2e+5,.5e-2,e3,.e3,2.1e3.5)浮點(diǎn)型常量以F(或f)結(jié)尾的表示單精度類型(float),以L(或小寫字母l)結(jié)尾的,表示長雙精度類型(longdouble)。若浮點(diǎn)型常量沒有任何說明,表示雙精度類型(double)。字符常量字符常量是用單引號括起來的一個字符。C/C++可以用一個“\”開頭的字符來表示特殊含義的字符常量。例如‘\n’,代表一個換行符,而不是表示字母n。這種將反斜杠(\)后面的字符轉(zhuǎn)換成另外意義的方法稱為轉(zhuǎn)義表示法,‘\n’稱為轉(zhuǎn)義字符。

字符串常量

C++可以使用字符串常量。字符串常量是一對雙引號括起來的字符序列。例如:“Hello,World!\n”。字符串常量中還可以包含空格、轉(zhuǎn)義字符或其他字符。并且必須在同一行書寫,若一行寫不下,則需要用‘\’來連接。例如:“ABCD\EFGHI”由于雙引號用作字符串的界限符,所以字符串中必須以轉(zhuǎn)義字符“\”“表示雙引號,例如:”Pleaseenter\”good\””;字符常量和字符串常量主要的區(qū)別:(1)

字符常量用單引號括起來的,僅占一個字節(jié);字符串常量是用雙引號括起來的,至少占用兩個字節(jié)?!癮”是字符串常量,它的長度不是1而是2,除字符a之外,末尾還有個‘\0’字符。每個字符串的末尾都有一個這樣的字符。(2)

字符常量實(shí)際上是整型常量的特殊形式,它可以參與常用的算術(shù)運(yùn)算;而字符串常量則不能。符號常量 在C++中,除了用C語言的#define定義符號常量外,還常常用const來定義符號常量。例:#definesize20//結(jié)尾不加分號

constintsize=20;1.3.3變量變量的定義

定義變量是用下面的格式:<類型><變量名列表>;(1)

可以將同類型的變量定義在一行語句中,不過變量名要用逗號(,)分隔。但在同一個程序塊中,不能有兩個相同的變量名。(2)

注意在C++中沒有字符串變量類型,字符串是用字符類型的數(shù)組或指針來定義的。(3)與C語言相比,C++變量的定義比較自由。

變量的初始化

程序中常需要對一些變量預(yù)先設(shè)置初值,這一過程稱為初始化。在C/C++中,可以在定義變量時同時使變量初始化。

C++變量的初始化還有另外一種形式,它與C語言不同。例如:

intnX(1),nY(3);

表示nX和nY是整型變量,它們的初值分別為1和3。1.3數(shù)據(jù)類型1.3.4數(shù)據(jù)類型轉(zhuǎn)換

自動轉(zhuǎn)換

自動轉(zhuǎn)換是將數(shù)據(jù)類型從低到高的順序進(jìn)行轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換

強(qiáng)制類型轉(zhuǎn)換是在程序中通過指定數(shù)據(jù)類型來改變圖所示的類型轉(zhuǎn)換順序,將一個變量從其定義的類型改變?yōu)榱硪环N新的類型。強(qiáng)制類型轉(zhuǎn)換有兩種格式:(<類型名>)<表達(dá)式> <類型名>(<表達(dá)式>)

這里的“類型名”是任何合法的C/C++數(shù)據(jù)類型,通過類型的強(qiáng)制轉(zhuǎn)換可以將“表達(dá)式”轉(zhuǎn)換成指定的類型。

1.3數(shù)據(jù)類型1.3.5數(shù)組

數(shù)組的定義 定義一個數(shù)組可按下列格式進(jìn)行:

<類型><數(shù)組名>[<常量表達(dá)式1>][<常量表達(dá)式2>]... <數(shù)組名>后面的常量表達(dá)式用于確定數(shù)組的維數(shù)和大小。 一般表示某維大小的常量表達(dá)式中不能包含變量,但可以包括常量和符號常量,其值必須是一個確定的整型數(shù)值,且數(shù)值大于1。

引用格式:

<數(shù)組名>[<下標(biāo)>]...

數(shù)組的賦值數(shù)組中的元素既可以在數(shù)組定義的同時賦初值,也可以在定義后賦值。如:數(shù)組元素的引用

intb[5]={1,2};

有時,在對全部數(shù)組元素賦初值時,可以不指定數(shù)組的長度,如:

intc[]={1,2,3,4,5};對于二維或多維數(shù)組也可同樣進(jìn)行初始化,需要說明的是:

(1)初始化數(shù)組的值的個數(shù)不能多于數(shù)組元素個數(shù),初始化數(shù)組的值也不能通過跳過逗號的方式來省略。 如:intf[5]={1,,3,4,5};//錯誤

intg[5]={1,2,3,};//在VC++中正確,它忽略最后一個值的逗號。

inth[5]={}; //語法格式錯誤

(2)對于二維數(shù)組來說,如果對全部元素都賦初值,則定義數(shù)組時對第一維的大小可以忽略,但第二維的大小不能省。

如:intk[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

(3)只對部分元素賦初值,可有兩種說明方式:一種是以“行”為單位,依次列出部分元素的值;另一種是以數(shù)組元素的排列順序依次列出前面部分元素的值。 例如:intm[3][4]={{1,2},{3},{4,5,6}};沒有明確列舉元素值的元素,其值均為0。

(例Ex_ArraySort)字符數(shù)組

C/C++語言中,一個字符串是用一個以空字符‘\0’作為結(jié)束符的字符串來表示的。例如:

charch[]={“hello!”};或

charch[]=“hello!”;或

charch[]={‘h’,’e’,’l’,’l’,’o’,’!’,’\0’};

上述定義的字符數(shù)組沒有指定數(shù)組長度的目的是,避免在初始化時,字符串中的字符個數(shù)大于數(shù)組長度,產(chǎn)生語法錯誤;如果指定數(shù)組長度大于字符串中的字符個數(shù),那么其余的元素將被系統(tǒng)默認(rèn)為空字符‘\0’。

charch[6]=“Hello!”;//數(shù)組超界錯誤對于二維字符數(shù)組,其初始化也可依上進(jìn)行,如:

charstr[][4]={“How”,”are”,”you”};

這時,數(shù)組元素str[0][0]表示一個字符,值為‘H’;str[0]表示一個字符串“How”,因為str[0]是一個一維字符數(shù)組。1.3數(shù)據(jù)類型1.3.6結(jié)構(gòu)體定義結(jié)構(gòu)體

結(jié)構(gòu)體定義的格式為:struct<結(jié)構(gòu)體名>{ <成員定義1>;

<成員定義2>;

... <成員定義n>;

}[結(jié)構(gòu)變量名列表];

結(jié)構(gòu)體定義是以關(guān)鍵字struct作為標(biāo)志的,<結(jié)構(gòu)體名>應(yīng)是一個有效的標(biāo)識符。在結(jié)構(gòu)體中的每個成員都必須通過“成員定義”來確定成員名及其類型。

structPERSON { char name[25]; int age; char sex; }family_member;

可以在結(jié)構(gòu)體定義后再定義結(jié)構(gòu)體變量,如:structPERSONsister;//struct關(guān)鍵字可以省略PERSONyou,me,he;注意:結(jié)構(gòu)體的成員變量類型既可以是基本數(shù)據(jù)類型,也可以是其他合法的類型。例如:structSTUDENT { PERSON one; //用已定義的結(jié)構(gòu)體類型聲明成員

floateng,phy,math,poli;//英語、物理、數(shù)學(xué)和政治的成 績

};1.3數(shù)據(jù)類型1.3.6結(jié)構(gòu)體結(jié)構(gòu)體變量的初始化和引用

結(jié)構(gòu)體變量的初始化的一般形式是在變量后面加上:={<初值列表>};

例如:

structPOINT { intx; inty; }spot={20,40}; //依次使spot中的x為20,y為40

POINTpt1={100,200}; //使pt1中的x為100,y為200 POINTpt2={100}; //只是使pt2中的x為100

當(dāng)一個結(jié)構(gòu)體變量定義之后,就可引用這個變量。使用時,遵循下列規(guī)則:

(1)只能引用結(jié)構(gòu)體變量中的成員變量,使用格式:<結(jié)構(gòu)體變量名>.<成員變量名>。

例如:cout<<spot.x<<spot.y;

“.”是成員運(yùn)算符,它的優(yōu)先級是最高的。(2)若成員本身又是一個結(jié)構(gòu)體變量,引用時需要用多個成員運(yùn)算符一級一級地找到要訪問的成員。例如:

structRECT { POINTptLeftTop; POINTptRightDown; }rc={{10,20},{40,50}};

1.3數(shù)據(jù)類型1.3.7共用體共用體和結(jié)構(gòu)體最大的區(qū)別是:共用體在任一時刻只有一個成員處于活動狀態(tài),且共用體變量所占的內(nèi)存長度等于各個成員中最長成員的長度,而結(jié)構(gòu)體變量所占的內(nèi)存長度等于各個成員的長度之和。共用體中各個成員所占內(nèi)存的字節(jié)數(shù)各不相同,但都是從同一地址開始的,使用覆蓋的方式共享存儲單元。這種多個成員變量共用一個內(nèi)存區(qū)的技術(shù),能有效地降低程序所占的內(nèi)存空間。定義一個共用體可用下列格式:

union<共用體名> { <成員定義1>;

<成員定義2>;

... <成員定義n>;

}[共用體變量名列表]; //注意最后的分號不要忘記。共用體除了關(guān)鍵字(union)不同外,其使用方法均與結(jié)構(gòu)體相同。

1.3數(shù)據(jù)類型1.3.8枚舉類型

枚舉類型是一系列有標(biāo)識符的整型常量的集合,增加程序代碼的可讀性。格式:

enum<枚舉類型名>{<枚舉常量列表>}[枚舉變量]; //注意最后的分號不要忘記。enum是關(guān)鍵字,枚舉常量表中的枚舉常量名之間要用逗號分隔。默認(rèn)時,系統(tǒng)為每一個枚舉常量都對應(yīng)一個整數(shù),并從0開始,逐個增1。例如:enumColors{Black,Blue,Green=4,Cyan,Red=8,Yellow,White}one;則各枚舉常量對應(yīng)的整數(shù)依次為0,1,4,5,8,9,10。枚舉變量最終的值只能等于該枚舉類型中的某個枚舉常量,而不能用一個整型數(shù)值直接賦值,并且不要在定義枚舉類型的同時,再對枚舉常量、枚舉變量及枚舉類型名重新定義。例:

ColorsMyColor;MyColor=Green;

1.3.9用typedef定義類型 使用關(guān)鍵字typedef可以將已有的類型名用新的類型名來代替,格式:

typedef <已有的類型名><類型別名>;

例如:

typedef float FLOAT; typedef char CH10[10];

這里,F(xiàn)LOAT表示float類型,CH10表示具有10個元素的字符數(shù)組類型,這樣,在以后的代碼中,就可以使用這些類型名定義新的變量,如:

FLOAT x,y; CH10 a,b//a,b都是具有10個元素的字符數(shù)組等價于:

float x,y; char x[10],y[10];1.4運(yùn)算符和表達(dá)式

1.4.1算術(shù)運(yùn)算符

算術(shù)運(yùn)算符包括雙目的加減乘除四則運(yùn)算符、求余運(yùn)算符以及單目的正負(fù)運(yùn)算符。算術(shù)運(yùn)算符如下所示:

+ (正號運(yùn)算符,如+4,+1.23等) - (負(fù)號運(yùn)算符,如-4,-1.23等) * (乘法運(yùn)算符,如6*8,1.4*3.56等) / (除法運(yùn)算符,如6/8,1.4/3.56等) % (模運(yùn)算符或求余運(yùn)算符,如40%11等) + (加法運(yùn)算符,如6+8,1.4+3.56等) - (減法運(yùn)算符,如6-8,1.4-3.56等)

注意:(1)

兩個整數(shù)相除,將保留整數(shù)部分,不是四舍五入;進(jìn)行浮點(diǎn)數(shù)除法,結(jié)果是浮點(diǎn)型。如7/5.0、7.0/5、7.0/5.0的結(jié)果都是1.4。(2)求余運(yùn)算要求參與運(yùn)算的兩個操作數(shù)都是整型,其結(jié)果是兩個數(shù)相除的余數(shù)。例如40%5的結(jié)果是0,40%11的結(jié)果是7。要理解負(fù)值的求余運(yùn)算,例如40%-11結(jié)果是7,-40%11結(jié)果是-7,-40%-11結(jié)果也是-7。

1.4運(yùn)算符和表達(dá)式1.4.2賦值運(yùn)算符復(fù)合賦值

10種復(fù)合賦值運(yùn)算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=

注意:

(1)

在復(fù)合賦值運(yùn)算符之間不能有空格。(2)復(fù)合運(yùn)算符的優(yōu)先級和賦值符的優(yōu)先級一樣,在C/C++的所有運(yùn)算符中只高于逗號運(yùn)算符,而且復(fù)合賦值運(yùn)算符的結(jié)合性也是從右至左的。

如:a*=b-4/c+d;等價于a=a*(b-4/c+d);多重賦值

多重賦值是指在一個賦值表達(dá)式中出現(xiàn)兩個或更多的賦值符(“=”)

例如:

nNum1=nNum2=nNum3=100;

賦值符的結(jié)合性是從右至左的,上述的賦值是這樣的過程:首先對賦值表達(dá)式nNum3=100求值,即將100賦值給nNum3,同時該賦值表達(dá)式取得值100;然后將該值賦給nNum2,這是第二個賦值表達(dá)式,該賦值表達(dá)式也取得值100;最后將100賦給nNum1。

1.4運(yùn)算符和表達(dá)式1.4.3關(guān)系運(yùn)算符

“關(guān)系運(yùn)算”是比較兩個操作數(shù)是否符合給定的條件。符合條件,則關(guān)系表達(dá)式的值為“真”,否則為“假”。在C++編譯系統(tǒng)中,往往將“真”表示為“true”或1,將“假”表示為“false”或0。而任何不為0的數(shù)被認(rèn)為是“真”,0被認(rèn)為是“假”。關(guān)系運(yùn)算需要兩個操作數(shù),所以關(guān)系運(yùn)算符都是雙目運(yùn)算符。

C++提供了下列6種關(guān)系運(yùn)算符:

<,<=,>,>=,==(相等于),!=(不等于)前4種的優(yōu)先級相同且高于后面的兩種。例:a==b>c等效于a==(b>c)

關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符。1.4.4邏輯運(yùn)算符

用于將多個關(guān)系表達(dá)式或邏輯量(“真”或“假”)組成一個邏輯表達(dá)式。提供3種邏輯運(yùn)算符:

! 邏輯非(單目)將“真”變“假”,“假”變“真”。

&& 邏輯與(雙目)當(dāng)兩個操作數(shù)都是“真”時,結(jié)果才為“真”,否則為“假”。

|| 邏輯或(雙目)當(dāng)兩個操作數(shù)中有一個是“真”時,結(jié)果就為“真”,而只有當(dāng)它們都為“假”時,結(jié)果才為“假”。

“邏輯非”、“邏輯與”和“邏輯或”的優(yōu)先級依次從高到低,“邏輯非”的優(yōu)先級比算術(shù)運(yùn)算符和關(guān)系運(yùn)算符高,“邏輯與”和“邏輯或”的優(yōu)先級比關(guān)系運(yùn)算符要低。

1.4運(yùn)算符和表達(dá)式1.4.5位運(yùn)算符

對操作數(shù)按其在計算機(jī)內(nèi)表示的二制數(shù)逐位地進(jìn)行邏輯運(yùn)算或移位運(yùn)算,參與運(yùn)算的操作數(shù)只能是整型常量或變量。提供了六種位運(yùn)算符:

~ (按位求反,單目運(yùn)算符)將一個二進(jìn)制數(shù)的每一位求反。

<< (左移,雙目運(yùn)算符)將左操作數(shù)的二進(jìn)制值向左移動指定的位數(shù)。左移后,低位 補(bǔ)0,移出的高位舍棄。

例:表達(dá)式4<<2的結(jié)果是16(二進(jìn)制00010000),其中4時操作數(shù),2是左移的位數(shù)

>> (右移,雙目運(yùn)算符)將左操作數(shù)的二進(jìn)制值向右移動指定的位數(shù)。右移后,移出的低位舍棄。如果是無符號數(shù)則高位補(bǔ)0;如果是有符號數(shù),則高位補(bǔ)符號位或補(bǔ)0,不同的編譯系統(tǒng)對此有不同的處理方法。

& (按位與,雙目運(yùn)算符)將兩個操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行邏輯與操作。 ^ (按位異或,雙目運(yùn)算符)將兩個操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行異或操作。

| (按位或,雙目運(yùn)算符)將兩個操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行邏輯或操作。1.4.6三目運(yùn)算符

唯一的三目運(yùn)算符是條件運(yùn)算符,格式:<條件表達(dá)式>?<表達(dá)式1>:<表達(dá)式2>。

注意:只有在表達(dá)式2后面才能出現(xiàn)分號結(jié)束符,“表達(dá)式1”和“表達(dá)式2”中都不能有分號。

例:nNum=(a>b)?10:81.4運(yùn)算符和表達(dá)式1.4.7增1和減1運(yùn)算符

++和--可放在變量的左邊也可在變量的右邊,分別稱前綴運(yùn)算符和后綴運(yùn)算符。 注意:若前綴運(yùn)算符和后綴運(yùn)算符僅用于某個變量的增1和減1,則這兩個都是等價的,但如果將這兩個運(yùn)算符和其他運(yùn)算符組合在一起,在求值次序上就會產(chǎn)生根本的不同:(1)

如果用前綴運(yùn)算符對一個變量增1(減1),則在將該變量增1(減1)后,用新的值在表達(dá)式中進(jìn)行其他的運(yùn)算。(2)

如果用后綴運(yùn)算符對一個變量增1(減1),則用該變量的原值在表達(dá)式進(jìn)行其他的運(yùn)算后,再將該變量增1(減1)。例:a=8; a=8;b=++a-1;//a=a+1,b=a-1 b=a++-1//b=a-1,a=a+11.4.8逗號運(yùn)算符

逗號運(yùn)算符是優(yōu)先級最低的運(yùn)算符,它可以使多個表達(dá)式放在一行上。計算時,從左至右逐個計算每個表達(dá)式,最終整個表達(dá)式的結(jié)果是最后計算的那個表達(dá)式的類型和值。例如:

j=(i=12,i+8);

式中,i=12,i+8是含逗號運(yùn)算符的表達(dá)式,計算次序是先計算表達(dá)式i=12,然后再計算i+8,整個表達(dá)式的值是最后一個表達(dá)式的值,即i+8的值20,

從而j的結(jié)果是20。

1.4運(yùn)算符和表達(dá)式1.4.9sizeof運(yùn)算符

sizeof的目的是返回操作數(shù)所占的內(nèi)存空間大小(字節(jié)數(shù)),具有兩種格式:

sizeof(<表達(dá)式>) sizeof(<數(shù)據(jù)類型>)

同一類型的操作數(shù)在不同的計算機(jī)中占用的存儲字節(jié)數(shù)可能不同,因此sizeof的結(jié)果有可能不一樣。例如sizeof(int)的值可能是4,也可能是2。

1.4.10new和delete

運(yùn)算符new返回指定類型的一個指針,分配失敗則返回0。例如:

double*p; p=newdouble;

系統(tǒng)自動根據(jù)double類型的空間大小開辟一個內(nèi)存單元,并將地址放在指針p中。運(yùn)算符delete操作是釋放new請求到的內(nèi)存。例如:deletep;

需要注意的是:(1)

運(yùn)算符delete必須用于先前new分配的有效指針。如果使用了未定義的其它任何類型的指針,就會帶來嚴(yán)重問題,如系統(tǒng)崩潰。(2)用new也可指定分配的內(nèi)存大小。

如: int*p; p=newint[60] //為p分配60個int類型的內(nèi)存單元

(3)new可以為數(shù)組分配內(nèi)存,當(dāng)釋放時,必須告訴delete數(shù)組有多少個元素。如:

int*p;p=newint[10];……. delete[10]p;(4)用new可以對指定分配的內(nèi)存進(jìn)行初始化

int*p;p=newint(0);1.5基本語句

1.5.1表達(dá)式語句、空語句和復(fù)合語句

表達(dá)式語句、空語句及復(fù)合語句是一些系統(tǒng)順序執(zhí)行的語句又稱為順序語句。任何一個表達(dá)式加上分號就是一個表達(dá)式語句。如果表達(dá)式是一個空表達(dá)式,那么構(gòu)成的語句稱為空語句??照Z句僅為語法的需要而設(shè)置,并不執(zhí)行任何動作。復(fù)合語句是由兩條或兩條以上的語句組成的,并由一對花括號({})括起來的語句。又稱塊語句。復(fù)合語句中的語句可以是單條語句(包括空語句),也可以再包含復(fù)合語句。注意:在復(fù)合語句中定義的變量只作用于該復(fù)合語句的范圍,而在復(fù)合語句外,這些變量卻不能被調(diào)用。1.5.2選擇語句

條件語句

格式:

if(<表達(dá)式>)<語句1> [else <語句2>]注意:(1)

條件語句中的表達(dá)式一般為邏輯表達(dá)式或關(guān)系表達(dá)式。表達(dá)式的類型也可以是任意的數(shù)值類型(包括整型、浮點(diǎn)型、字符型等)。(2)

適當(dāng)添加一些花括號(“{}”)來增加程序的可讀性。(3)

條件語句中的語句1和語句2也可是if條件語句,這就形成了if語句的嵌套。

else總是和其前面最近的if配套的。

1.5基本語句開關(guān)語句

開關(guān)語句switch能很好地解決嵌套太多這種問題,它具有下列形式:

switch(<表達(dá)式>) { case<常量表達(dá)式1> :[語句1] case<常量表達(dá)式2> :[語句2] ... case<常量表達(dá)式n> :[語句n] [default :語句n+1]}

當(dāng)表達(dá)式的值與case中某個表達(dá)式的值相等時,就執(zhí)行該case中“:”號后面的所有語句。若case中所有表達(dá)式的值都不等于表達(dá)式的值,則執(zhí)行default:后面的語句,若default不存在,則跳出switch結(jié)構(gòu)。

注意:

(1)

switch后面的表達(dá)式可以是整型、字符型或枚舉型的表達(dá)式,而case后面的常量表達(dá)式的類型必須與其匹配。

(2)

多個case可以共有一組執(zhí)行語句。

(3)

若同一個case后面的語句是復(fù)合語句,則這些語句可以不用花括號(“{}”)括起來。

(4)

case語句起標(biāo)號作用,因此每一個case常量表達(dá)式的值必須互不相同,否則會出現(xiàn)編譯錯誤。

(5) 合理使用break語句使其跳出switch結(jié)構(gòu),以保證結(jié)果的正確性;若沒有break語句,則后面的語句繼續(xù)執(zhí)行,直到switch結(jié)構(gòu)的最后一個花括號(“}”)為止才跳出該結(jié)構(gòu)。

1.5基本語句1.5.3循環(huán)語句while循環(huán)語句 語句格式:

while(<表達(dá)式>) <語句> <語句>是循環(huán)體,可以是一條語句,也可以是復(fù)合語句。當(dāng)表達(dá)式為非0時便開始執(zhí)行while循環(huán)體中的語句,然后反復(fù)執(zhí)行,每次執(zhí)行都會判斷表達(dá)式是否為非0,若等于0,則終止循環(huán)。

注意:循環(huán)體中應(yīng)有使循環(huán)趨向結(jié)束的語句。(例Ex_SumWhile)do...while循環(huán)語句 語句格式:

do<語句> while(<表達(dá)式>)

當(dāng)語句執(zhí)行到while時,將判斷表達(dá)式是否為非0值,若是,則繼續(xù)執(zhí)行循環(huán)體,直到下一次表達(dá)式等于0為止。(例Ex_SumDoWhile)1.5基本語句for循環(huán)語句

語句格式:

for([表達(dá)式1];[表達(dá)式2];[表達(dá)式3])<語句>

一般情況下,[表達(dá)式1]用作循環(huán)變量的初始化,[表達(dá)式2]是循環(huán)體的判斷條件,當(dāng)?shù)扔诜?時,開始執(zhí)行循環(huán)體,再計算[表達(dá)式3],再判斷表達(dá)式2的值是否為非0,若是,再執(zhí)行循環(huán)體,再計算表達(dá)式3,如此反復(fù),直到表達(dá)式2等于0為止。

注意:表達(dá)式1、2、3都可以省略,分號“;”不能省略。省略表達(dá)式1,不影響正確執(zhí)行,但所需要的一些變量及其相關(guān)的數(shù)值要在for語句之前定義。省略表達(dá)式2,則表達(dá)式2的值被認(rèn)為是“真”,

循環(huán)無終止地進(jìn)行下去,應(yīng)在循環(huán)體中使用break語句。省略表達(dá)式3,應(yīng)在設(shè)計循環(huán)結(jié)構(gòu)時保證表達(dá)式2的值有等于0的可能,以便能終止循環(huán)。下面幾種方式,其作用和結(jié)果都是一樣的:

方式1:

intnNum=1,nTotal=0; for(;nNum<=50;nNum++) { nTotal+=nNum; }方式2: ` 方式3:

intnNum=1,nTotal=0; intnNum=1,nTotal=0; for(;nNum<=50;) for(;;) { { nTotal+=nNum; nTotal+=nNum; nNum++; nNum++; } if(nNum>50)break; }(2)

表達(dá)式1和表達(dá)3可以是一個簡單的表達(dá)式,也可以是逗號表達(dá)式,即包含兩個或兩個以上的簡單表達(dá)式,中間用逗號分隔。甚至還可以定義變量。例如:

intnTotal=0; for(intnNum=1;nNum<=50;nNum++)nTotal+=nNum;(3)

由于循環(huán)體是由任何類型的語句組成的,因此在循環(huán)體內(nèi)還可以包含前面的幾種循環(huán)語句,這樣就形成了循環(huán)的嵌套。1.5.4break、continue語句

跳出循環(huán)結(jié)構(gòu)或重新開始循環(huán),就得使用break和continue語句,格式如下:

break; //可以從一個循環(huán)體跳出,也可以跳出switch結(jié)構(gòu)。

break語句只能用于循環(huán)語句和switch-case語句中,有兩個用途:

1)在switch語句中用來使流程跳出swith結(jié)構(gòu),繼續(xù)執(zhí)行switch語句后面的語句。

2)在循環(huán)體內(nèi),迫使所在循環(huán)立即終止,即跳出本層循環(huán)體,執(zhí)行循環(huán)體后面的語句。注意:break語句只能結(jié)束包含它的最內(nèi)層循環(huán),而不能跳出多重循環(huán)。

for() { … while() { if() break;

… } }continue; //用于依靠條件判斷而進(jìn)行循環(huán)的循環(huán)語句,如for、 while語句。對于for語句來說,continue的目的是將流程轉(zhuǎn)到for語句的表達(dá)2和表達(dá)式3。(例(Ex_Continue)Continue與break的區(qū)別:Continue只結(jié)束本次循環(huán),而不是終止整個循環(huán)語句的執(zhí)行,break則是終止整個循環(huán)語句的執(zhí)行,跳出所在循環(huán)體,轉(zhuǎn)到循環(huán)語句外的下一條語句去執(zhí)行1.6函數(shù)1.6.1函數(shù)的定義和調(diào)用

函數(shù)的定義格式

定義的格式如下:

<函數(shù)類型><函數(shù)名>(<形式參數(shù)表>) {<若干語句> }

函數(shù)名后面必須跟一對圓括號“()”以區(qū)別變量名及其他用戶定義的標(biāo)識名。形參寫在括號內(nèi),參數(shù)可以是0,表示沒有參數(shù),但圓括號不能省略。也可以是一個或多個,多個參數(shù)間要用逗號分隔。 函數(shù)的函數(shù)體由在一對花括號中的若干條語句組成,用于實(shí)現(xiàn)這個函數(shù)執(zhí)行的動作。C/C++不允許在一個函數(shù)體中再定義函數(shù)。

函數(shù)的聲明

聲明函數(shù)格式:

<函數(shù)類型><函數(shù)名>(<形式參數(shù)表>);

形參的變量名可以省略。但注意,函數(shù)聲明的內(nèi)容應(yīng)和函數(shù)的定義相同。

intsum(intx,inty);和intsum(int,int);是等價的。 函數(shù)的聲明必須在函數(shù)定義前進(jìn)行或在調(diào)用前進(jìn)行。函數(shù)的調(diào)用

函數(shù)調(diào)用格式為:

<函數(shù)名>(<實(shí)際參數(shù)表>);

實(shí)參與形參相對應(yīng),是實(shí)際調(diào)用函數(shù)時所給定的常量、變量或表達(dá)式,必須有確定的值。

1.6函數(shù)1.6.2帶默認(rèn)形參值的函數(shù)

C++允許在函數(shù)的聲明或定義時給一個或多個參數(shù)制訂默認(rèn)值。這樣在調(diào)用時,可以不給出參數(shù),而按指定的默認(rèn)值進(jìn)行傳遞。例如:

例Ex_Default

#include<iostream.h> voiddisplay(inta,intb=2,intc=3) { cout<<“a=“<<a<<“,b=“<<b<<“,c=“<<c<<“\n”; }

voidmain() { display(1); display(1,5); display(1,7,9); }注意:

(1)

當(dāng)函數(shù)既有聲明又有定義后,不能在函數(shù)定義中指定默認(rèn)參數(shù)。

(2)

默認(rèn)參數(shù)值可以是全局變量、全局常量、一個函數(shù)。不可以是局部變量,因為默認(rèn)參數(shù)的函數(shù)調(diào)用是在編譯時確定的,局部變量的值在編譯時無法確定。

(3)一個函數(shù)中有多個默認(rèn)參數(shù)時,則形參分布中,默認(rèn)參數(shù)應(yīng)從右到左逐漸定義。函數(shù)調(diào)用時,系統(tǒng)按從左到右的順序?qū)?shí)參與形參結(jié)合,當(dāng)實(shí)參的數(shù)目不足時,系統(tǒng)將按同樣的順序用聲明或定義中的默認(rèn)值來補(bǔ)齊所缺少的參數(shù)。

1.6.3函數(shù)的遞歸調(diào)用

C++允許在調(diào)用一個函數(shù)的過程中出現(xiàn)直接地或間接地調(diào)用函數(shù)本身,這種情況稱為函數(shù)的“遞歸”調(diào)用,相應(yīng)的函數(shù)稱為遞歸函數(shù)。(例Ex_Factorial)

遞歸函數(shù)中必須要有結(jié)束遞歸過程的條件,否則遞歸會無限制地進(jìn)行下去。 遞歸調(diào)用編寫的程序簡潔清晰,但每次調(diào)用函數(shù)時,都需要分配內(nèi)存來保存現(xiàn)場和返回地址,內(nèi)存空間開銷很大,有時會引起棧內(nèi)存溢出。1.6函數(shù)1.6.4內(nèi)聯(lián)函數(shù)

程序的執(zhí)行過程中,調(diào)用函數(shù)時先要保存主調(diào)函數(shù)的現(xiàn)場和返回地址,然后程序轉(zhuǎn)移到被調(diào)函數(shù)的起始地址繼續(xù)執(zhí)行。被調(diào)函數(shù)執(zhí)行結(jié)束后,先恢復(fù)主調(diào)函數(shù)的現(xiàn)場,取出返回地址并將返回值賦給函數(shù)調(diào)用本身,最后在返回地址處開始繼續(xù)執(zhí)行。當(dāng)函數(shù)體比較小時,且執(zhí)行的功能比較簡單時,這種函數(shù)調(diào)用方式的系統(tǒng)開銷相對較大。內(nèi)聯(lián)函數(shù)把函數(shù)體的代碼直接插入到調(diào)用處,將調(diào)用函數(shù)的方式改為順序執(zhí)行直接插入的程序代碼,這樣可以減少程序的執(zhí)行時間,但同時需要更多的內(nèi)存空間。

內(nèi)聯(lián)函數(shù)的定義方法是在函數(shù)定義時,在函數(shù)的類型前增加關(guān)鍵字inline。(例Ex_Inline)

注意:

(1)

內(nèi)聯(lián)函數(shù)也要遵循定義在前,調(diào)用在后的原則。

(2)

需要定義成的內(nèi)聯(lián)函數(shù)不能含有循環(huán)、switch和復(fù)雜嵌套的if語句。

(3)

遞歸函數(shù)是不能被用來做內(nèi)聯(lián)函數(shù)的。 編譯器是否將用戶定義成的內(nèi)聯(lián)函數(shù)作為真正的內(nèi)聯(lián)函數(shù)處理由它自行決定。

1.6函數(shù)1.6.5函數(shù)的重載

它允許多個同名的函數(shù)存在,但同名的各個函數(shù)的形參必須有區(qū)別:形參的個數(shù)不同,或者形參的個數(shù)相同,但參數(shù)類型有所不同。

(例Ex_OverLoad)需要說明的是:(1)

重載函數(shù)必須具有不同的參數(shù)個數(shù)或不同的參數(shù)類型,若只有返回值的類型不同是不行的。 如:inttest(inta,intb); doubletest(inta,intb);(2)

當(dāng)函數(shù)的重載帶有默認(rèn)參數(shù)時,應(yīng)該注意避免二義性。 例如:

intfun(inta,intb=0); intfun(inta);

是錯誤的。因為如果有函數(shù)調(diào)用fun(2)時,編譯器無法準(zhǔn)確地確定應(yīng)調(diào)用哪個函數(shù)。

1.7指針和引用

1.7.1指針和指針變量

指針變量不同于其它類型的變量,它是用來專門存放地址的。 指針變量格式定義:

<類型名>*<指針變量名1>[,*<指針變量名2>,...];

“*”是一個定義指針變量的說明符,指針變量前面都需這樣的“*”標(biāo)明。例如:

int *pInt1,*pInt2; //pInt1,pInt2是指向整型變量的指針

float *pFloat; //指向浮點(diǎn)型變量

char *pChar //指向字符型變量的指針,通常用來處理 字符串1.7.2&和*運(yùn)算符

&(取地址運(yùn)算符)、*(取值運(yùn)算符)運(yùn)算符“&”只能對變量操作,作用是取該變量的地址。對于常量,表達(dá)式以及寄存器變量不能取地址,不允許以下形式:

&3,&(i+4),registerintx;

這些常量、表達(dá)式、寄存器變量的值都不是存放在內(nèi)存某個存儲單元中,而是放在寄存器里,寄存器無地址。且,在程序中取一個變量的地址必須在定義變量后才可進(jìn)行。運(yùn)算符“*”用于指針類型的變量操作,作用是取該指針?biāo)竷?nèi)存單元中存儲的內(nèi)容。例如:

inta=3; //整型變量,初值為3int*p=&a; //指向整形變量的指針,其值等于a的地 址

intb=*p; //將指針?biāo)傅牡刂分械膬?nèi)容賦值給b,值為3說明:

(1)在使用指針變量前,一定要對其進(jìn)行初始化或使其有確定的地址數(shù)值。

(2)指針變量只能賦以一個指針的值,若給指針變量賦了一個變量的值而不是該變量的地址或者賦了一個常量的值,則系統(tǒng)會以這個值作為地址。根據(jù)這個“地址”讀寫的結(jié)果將是致命的。

(3)兩個指針變量進(jìn)行賦值,必須使這兩個指針變量類型相同。

(4)給指針變量賦值實(shí)際上是“間接”給指針?biāo)赶虻淖兞抠x值1.7指針和引用1.7.3指針和數(shù)組

數(shù)組中所有元素都是依次存儲在內(nèi)存單元中的,每個元素都有相應(yīng)的地址。數(shù)組名代表數(shù)組中第一個元素的地址,即數(shù)組的首地址。 指針變量和數(shù)組的數(shù)組名在本質(zhì)上是一樣,因此指向數(shù)組的指針變量實(shí)際上也可像數(shù)組變量那樣使用下標(biāo),而數(shù)組變量又可像指針變量那樣使用指針。例如:pi[i]與*(pi+i)及a[i]是等價的,*(a+i)與*(pi+i)是等價的。

#include<iostream.h>voidmain() { inta[]={2,4,6,8,10}; int*pa=a; intresult=0; for(inti=0;i<5;i++) { result+=*pa; pa++; }

cout<<“result=“<<result<<“\n”; }指針與字符數(shù)組 用字符指針可以指向字符串中的字符。如:

char*s1=“Hello,World!”;

在C++中,字符串常量是按字符數(shù)組處理的,實(shí)際上在內(nèi)存中開辟了一個字符數(shù)組來存放字符串常量,并將字符串的首地址賦給字符指針變量s1,該語句等價為:

char*s1; S1=“Hello,World!”; //字符串常量是地址例Ex_PString1.7.4指針和結(jié)構(gòu)體

指針也可指向結(jié)構(gòu)體類型變量,一個結(jié)構(gòu)體變量保存的是結(jié)構(gòu)體的存儲空間的首地址。結(jié)構(gòu)體指針定義的一般形式為

struct 結(jié)構(gòu)體類型名*結(jié)構(gòu)體指針變量名例;structstudent { longintnum; charname[20]; charsex; }st;

Structstudent*p; p=&st;

訪問結(jié)構(gòu)體成員的方法有三種:

1)結(jié)構(gòu)體變量名.成員名

2)(*結(jié)構(gòu)體指針).成員名

3)結(jié)構(gòu)體指針-〉成員名

若將結(jié)構(gòu)體變量看成一個整體,那么指向結(jié)構(gòu)體變量數(shù)組的指針操作和指向數(shù)組的指針操作是一樣的。例如若有:

PERSON many[10],*pp; pp=many; //等價于pp=&many[0];

則pp+i與many+i是等價的,(pp+i)->name與many[i].name是等價的,等等。1.7指針和引用1.7.5函數(shù)的指針傳遞

如果函數(shù)的某個參數(shù)是指針,對這函數(shù)的調(diào)用就是按地址傳遞的,由于函數(shù)形參指針和實(shí)參指針指向同一個地址,因此形參內(nèi)容的改變必將影響實(shí)參。(例Ex_SwapUsePointer)1.7.6引用 引用是給一個已定義的變量起一個別名,系統(tǒng)不為引用類型變量分配內(nèi)存空間,只是使引用類型變量與其相關(guān)聯(lián)的變量使用同一個內(nèi)存空間。

引用類型變量定義格式:

<類型>&<引用名>=<變量名>或<類型>&<引用名>(<變量名>)

其中,變量名必須是一個已定義過的變量。例如:

inta=3; int&ra=a;

這樣,ra就是一個引用,它是變量a的別名,所有對引用ra的操作,實(shí)質(zhì)上就是對a的操作。例如;ra=ra+2;

實(shí)質(zhì)上是a加2,a的結(jié)果為5;引用與指針的最大區(qū)別是: 指針是一個變量,可以把它再賦值成指向別處的地址,而引用一旦初始化后,其地址不會再改變。在使用引用時,還要注意的是:

(1)

定義引用類型變量時,必須將其初始化。而且引用變量類型必須與為它初始化的變量類型相同。例如:

inta=3;float&fval=a;//錯誤

(2)

當(dāng)引用類型變量的初始化值是常數(shù)的,則必須將該引用定義成const類型。 例如:constint&ref=2(3)

不能引用一個數(shù)組,這是因為數(shù)組是某個數(shù)據(jù)類型元素的集合,數(shù)組名表示該元素集合空間的起始地址,它自己不是一個真正的數(shù)據(jù)類型。例如:

inta[10]; int&ra=a; //錯誤:不能建立數(shù)組的引用

(4)

可以引用一個結(jié)構(gòu)體。 引用本身不是一種數(shù)據(jù)類型,所以沒有引用的引用,也沒有引用的指針。1.7指針和引用1.7.7函數(shù)的引用傳遞

指針作為函數(shù)的參數(shù)時,形參改變后相應(yīng)的實(shí)參也會改變。但如果以引用作為參數(shù),則既可以實(shí)現(xiàn)指針?biāo)鶐淼墓δ?,而且更加簡便自然?一個函數(shù)能使用引用傳遞的方式是在函數(shù)定義時將形參前加上引用運(yùn)算符“&”。

#include<iostream.h> voidswap(int&x,int&y); voidmain() { inta(7),b(11); swap(a,b); cout<<"a="<<a<<",b="<<b<<"\n";}voidswap(int&x,int&y) { inttemp; temp=x;x=y;y=temp; cout<<"x="<<x<<",y="<<y<<"\n"; }

結(jié)果是:

x=11,y=7 a=11,b=7 swap中的&x和&y就是形參的引用說明。執(zhí)行swap(a,b);時,實(shí)際上是將實(shí)參a、b的地址存放到系統(tǒng)為形參分配的內(nèi)存空間中,形參的任何操作都會改變相應(yīng)的實(shí)參的數(shù)值。 引用除了可作為函數(shù)的參數(shù)外,還可作為函數(shù)的返回值。1.8作用域和存儲類型

1.8.1作用域

塊作用域 塊就是塊語句。在塊中聲明的標(biāo)識符,其作用域從聲明處開始,一直到結(jié)束塊的花括號為止。具有塊作用域的標(biāo)識符稱作局部標(biāo)識符,塊作用域也稱作局部作用域。 說明:

(1)當(dāng)標(biāo)識符的作用域完全相同時,不允許出現(xiàn)相同的標(biāo)識符名。而當(dāng)標(biāo)識符具有不同的作用域時,允許標(biāo)識符同名。(2)VisualC++中,在for語句中聲明的標(biāo)識符,其作用域是包含for語句的那個內(nèi)層塊,而不是僅僅作用于for語句,這與標(biāo)準(zhǔn)C++不一樣。

函數(shù)原型作用域 在聲明函數(shù)原型所指定的參數(shù)標(biāo)識符的作用范圍。這個作用范圍是在函數(shù)原型聲明中的左、右括號之間。在函數(shù)原型中聲明的標(biāo)識符可以與函數(shù)定義中說明的標(biāo)識符名稱不同。所聲明的標(biāo)識符與該函數(shù)的定義及調(diào)用無關(guān),可以在函數(shù)原型聲明中只作參數(shù)的類型聲明,而省略參數(shù)名。1.8作用域和存儲類型函數(shù)作用域

只有g(shù)oto語句中的標(biāo)號標(biāo)識符具有函數(shù)作用域。具有函數(shù)作用域的標(biāo)識符在聲明它的函數(shù)內(nèi)隨處可見,但在此函數(shù)之外不可見。由于goto語句的濫用導(dǎo)致程序流程無規(guī)則、可讀性差。因此現(xiàn)代程序設(shè)計方法不主張使用goto語句。

voidf() { gotoA; intb; cin>>b;if(b>0) {A:; gotoB; }

B:cout<<“Alldone”<<endl;}if(b>0) {A:; gotoB; }

B:cout<<“Alldone”<<endl;}1.8作用域和存儲類型文件作用域

在函數(shù)或類之外定義的標(biāo)識符或用extern說明的標(biāo)識符稱為全局標(biāo)識符。全局標(biāo)識符的作用域稱為文件作用域,它從聲明之處開始,直到文件結(jié)束一直是可見的。如果一個標(biāo)識符出現(xiàn)在頭文件中,則該標(biāo)識符的作用域擴(kuò)展到包含了這個頭文件的程序。 在同一個作用域中,不能對同名的標(biāo)識符作多種不同的聲明。而當(dāng)塊作用域內(nèi)的標(biāo)識符與全局標(biāo)識符同名時,局部標(biāo)識符優(yōu)先,且在塊作用域內(nèi)使用作用域運(yùn)算符“::”來引用與局部標(biāo)識符同名的全局標(biāo)識符。1.8.2變量的存儲類型

規(guī)定了變量的生存期。無論是全局變量還是局部變量,編譯系統(tǒng)往往根據(jù)其存儲方式定義、分配和釋放相應(yīng)的內(nèi)存空間。全局變量是指其作用域是文件作用域的變量,局部變量是指其作用域小于文件作用域的變量。自動類型(auto)

一般用自動存儲類型聲明的變量都是限制在某個程序范圍內(nèi)使用的。從系統(tǒng)角度來說,自動存儲類型變量是采用堆棧方式分配內(nèi)存空間。當(dāng)程序執(zhí)行到超出該變量的作用域時,就釋放它所占用的內(nèi)存空間,其值也隨之消失了。

聲明一個自動存儲類型的變量是在變量類型前面加上關(guān)鍵字auto。若自動存儲類型的變量是在函數(shù)內(nèi)或語句塊中聲明的,則可省略關(guān)鍵字auto。靜態(tài)類型(static)

靜態(tài)類型的變量也是一種局部變量。靜態(tài)類型變量在內(nèi)存中是以固定地址存放的,不是以堆棧方式存放的。只要程序在繼續(xù)執(zhí)行,它的值就有效,不會隨它所在的函數(shù)或語句塊的結(jié)束而消失。 聲明一個靜態(tài)類型的變量是在變量類型前面加上關(guān)鍵字static。需要說明的是:

(1)靜態(tài)類型的變量均有確定的初值,當(dāng)聲明變量時沒有指定其初值,則編譯器將其初值置為0。

(2)程序中聲明的全局變量是靜態(tài)存儲類型,若在全局變量前加一個static,使該變量只在這個源程序文件內(nèi)使用,稱之為全局靜態(tài)變量或靜態(tài)全局變量。若一個程序由一個文件組成,在聲明全局變量時,有無static并沒有區(qū)別,但若多個文件組成一個程序時,加與不加static,其作用完全不同。靜態(tài)全局變量對組成該程序的其他源文件是無效的,它能很好地解決在程序多文件組織中全局變量的重名問題。

(3)靜態(tài)函數(shù)是在某個函數(shù)聲明前加上static,它的目的是使該函數(shù)只在聲明的源文件中使用,對于其他源文件則無效。

(例Ex_Static)1.8作用域和存儲類型寄存器類型(register)

一般情況下,變量的值存放在內(nèi)存中,只有程序指令需要時,才從內(nèi)存中讀取到CPU內(nèi)。C++允許將頻繁使用的變量存放在CPU內(nèi)部的寄存器中,從而加快程序的運(yùn)行速度。但有時在使用這種聲明時,若系統(tǒng)寄存器已經(jīng)被其他數(shù)據(jù)占據(jù)時,寄存器類型的變量就會被系統(tǒng)自動默認(rèn)為auto變量。

注意:只有自動變量和形參可以作為“寄存器變量”,而其他變量(全局變量,局部靜態(tài)變量)不可以。外部類型(extern)

使用extern聲明的變量稱為外部變量,一般指定義在本程序外部的變量。某個變量被聲明成外部變量時,不必再次為它分配內(nèi)存就可以在本程序中引用這個變量。只有在兩種情況下要使用外部變量:在同一個源文件中,若定義的變量使用在前,聲明在后,這時在使用前要聲明為外部變量。當(dāng)由多個文件組成一個完整的程序時,在一個源程序文件中完全定義的變量要被其他若干個源文件引用時,引用的文件中要使用extern聲明外部變量。 外部變量對不同源文件中或函數(shù)之間的數(shù)據(jù)傳遞特別有用。這種能被許多函數(shù)共享的外部變量,其數(shù)據(jù)值的任何一次改變,都將影響到所有引用此變量的函數(shù)的執(zhí)行結(jié)果,其危險性是顯而易見的。

1.9預(yù)處理

宏定義命令

用#define可以定義一個符號常量,如:#define PI3.141593 #define就是宏定義命令,它的作用是將3.141593用PI代替;PI稱為宏名。需要注意的是:

(1)

#define、PI和3.141593之間一定要有空格,且一般將宏名定義成大寫,以便與普通標(biāo)識符相區(qū)別。

(2)

宏被定義后,使用下列命令后可重新定義:#undef 宏名

(3)

一個定義過的宏名可以用來定義其它新的宏。

(4)

宏還可以帶參數(shù)。

#defineMAX(a,b)((a)>(b)?(a):(b))文件包含命令

所謂“文件包含”是指將另一個源文件的內(nèi)容合并到源程序中。C/C++語言提供了#include命令用來實(shí)現(xiàn)文件包含的操作,它有下列兩種格式:

#include<文件名> #include“文件名”

文件名一般是以.h為擴(kuò)展名,因而稱它為“頭文件”,如前面的程序中iostream.h是頭文件的文件名。文件包含的兩種格式中,第一種格式是將文件名用尖括號“<>”括起來的,用來包含那些由系統(tǒng)提供的并放在指定子目錄中的頭文件。第二種格式是將文件名用雙引號括起來的,用來包含那些由用戶定義的放在當(dāng)前目錄或其他目錄下的頭文件或其他源文件。1.9預(yù)處理條件編譯命令

有時希望根據(jù)一定的條件去編譯源文件的不同部分,就是“條件編譯”。條件編譯使得同一源程序在不同的編譯條件下得到不同的目標(biāo)代碼。有幾種常用的形式:

(1)

第一種形式

#ifdef<標(biāo)識符> <程序段1> [#else <程序段2>] #endif

<程序段>是由若干條預(yù)處理命令或語句組成的。含義是:如果標(biāo)識符已被#define命令定義過,則編譯<程序段1>,否則編譯<程序段2>(2)

第二種形式

#ifndef<標(biāo)識符> <程序段1> [#else <程序段2>] #endif

與前一種形式的區(qū)別僅在于,如果標(biāo)識符沒有被#define命令定義過,則編譯<程序段1>,否則就編譯<程序段2>。

2.1類和對象

2.1.1從結(jié)構(gòu)到類

2.1.2類的定義

一般地分為聲明部分和實(shí)現(xiàn)部分。聲明部分是用來聲明該類中的成員,含數(shù)據(jù)成員和成員函數(shù)的聲明。成員函數(shù)是用來對數(shù)據(jù)成員進(jìn)行操作的。實(shí)現(xiàn)部分是用來對成員函數(shù)的定義。聲明部分將告訴使用者“干什么”,而實(shí)現(xiàn)部分是告訴使用者“怎么干”。

定義類的一般格式如下:

class<類名> {private: [<私有數(shù)據(jù)和函數(shù)>] public: [<公有數(shù)據(jù)和函數(shù)>]};

<各個成員函數(shù)的實(shí)現(xiàn)>class的后面是用戶定義的類名,類中的數(shù)據(jù)和函數(shù)是類的成員,分別稱為數(shù)據(jù)成員和成員函數(shù)。由于數(shù)據(jù)成員是用變量來描述的,因此數(shù)據(jù)成員又可稱為“成員變量”。

public和private聲明了類中的成員和程序其他部分的關(guān)系。對于public類成員來說,它們是公有的,能被外面的程序訪問;對于private類成員來說,它們是私有的,只能由類中的函數(shù)所使用,而不能被外面的程序所訪問。

<各個成員函數(shù)的實(shí)現(xiàn)>是類定義中的實(shí)現(xiàn)部分,包含所有在類體中聲明的函數(shù)的定義。如果一個成員函數(shù)在類體中定義,實(shí)現(xiàn)部分將不出現(xiàn)。如果所有的成員函數(shù)都在類體中定義,則實(shí)現(xiàn)部分可以省略。當(dāng)類的成員函數(shù)的函數(shù)體在類的外部定義時,必須由作用域運(yùn)算符“::”來通知編譯系統(tǒng)該函數(shù)所屬的類。

2.1類和對象

定義類時還應(yīng)注意:(1)

在“public:”或“private:”后面定義的所有成員都是公有或私有的,直到下一個“public:”或“private:”出現(xiàn)為止。若成員前面沒有類似“public:”或“private:”,則所定義的成員是private(私有),這是類的默認(rèn)設(shè)置。(2)

關(guān)鍵字public和private可以在類中出現(xiàn)多次,且前后的順序沒有關(guān)系。但最好先聲明公有成員,后聲明私有成員,因為public成員是用戶最關(guān)心的。(3)

除了public和private外,關(guān)鍵字protected(保護(hù))也可修飾成員的類型,它與private兩者基本相似,但在類的繼承時有所不同。(4)

數(shù)據(jù)成員的類型可以是任意的,包含整型、浮點(diǎn)型、字符型、數(shù)組、指針等,也可以是另一個類的對象,但不允許對所定義的成員變量進(jìn)行初始化。

(5)盡量將類單獨(dú)存放在一個文件中或?qū)㈩惖穆暶鞣旁?h文件中而將成員函數(shù)的實(shí)現(xiàn)放在與.h文件同名的.cpp文件中。以后將會看到,VisualC++6.0為用戶創(chuàng)建的應(yīng)用程序框架中都是將各個類以.h和同名的.cpp文件來組織的。

2.1類和對象2.1.3對象的定義

一個類定義后,就可以定義該類的對象,格式: <類名><對象名列表>

類名是用戶已定義過的類的標(biāo)識符,對象名可以有一個或多個,多個時要用逗號分隔。被定義的對象既可以是一個普通對象,也可以是一個數(shù)組對象或指針對象。一個對象的成員就是該對象的類所定義的成員,引用(訪問)時可用下列方式:

<對象名>.<成員名> <對象名>.<成員名>(<參數(shù)表>)。前者用來表示引用數(shù)據(jù)成員,后者用來表示引用成員函數(shù)?!?”是一個成員運(yùn)算符,用來引用對象的成員對于指針對象的成員引用可用下列方式:

<對象指針名>-><成員名> <對象指針名>-><成員名>(<參數(shù)表>)“->”與“.”運(yùn)算符的區(qū)別是:“->”用來訪問指針對象的成員,“.”用來訪問一般對象的成員。需要說明的是,下面的兩種表示是等價的:

<對象指針名>-><成員名> (*<對象指針名>).<成員名>

這對于成員函數(shù)也適用,例如two->GetAverage()和(*two).GetAverage()是等價的,由于成員運(yùn)算符“.”的優(yōu)先級比取內(nèi)容運(yùn)算符“*”高。若結(jié)構(gòu)成員前面沒有“public:”或“private:”,則所定義的成員是public(公有)。

2.2類的成員及特性

2.2.1構(gòu)造函數(shù)

使用構(gòu)造函數(shù)能給數(shù)據(jù)成員自動設(shè)置某些初始值。它的最大特點(diǎn)是在對象建立時它會被自動執(zhí)行,因此用于變量、對象的初始化代碼一般放在構(gòu)造函數(shù)中。構(gòu)造函數(shù)必須與相應(yīng)的類同名,可以帶參數(shù),可以不帶參數(shù),而且可以重載。但不能指定函數(shù)返回值的類型,也不能指定為void類型。例如:classCStuScore { public: CStuScore(charstr[12]) //第一個構(gòu)造函數(shù)

{ strcpy(strName,str); } CStuScore(charstr[12],charstrNO[9]) //第二個構(gòu)造函數(shù)

{ strcpy(strName,str); strcpy(strStuNO,strNO);} char strName[12]; //姓名

char strStuNO[9]; //學(xué)號

...}

(1)

程序中的strcpy是一個庫函數(shù),用來復(fù)制字符串,使用時要頭文件string.h。

(2)

類定義時,如沒有定義任何構(gòu)造函數(shù),編譯器自動為類生成一個不帶任何參數(shù)的默認(rèn)構(gòu)造函數(shù)。

(3)

由于構(gòu)造函數(shù)的參數(shù)只能在定義對象時指定。

2.2類的成員及特性2.2.2析構(gòu)函數(shù)

與構(gòu)造函數(shù)相對應(yīng)的另一種特殊的C++成員函數(shù)是析構(gòu)函數(shù),它的功能是用來釋放一個對象,在對象刪除前,用它來做一些清理工作,它與構(gòu)造函數(shù)的功能正好相反。 析構(gòu)函數(shù)也要與相應(yīng)的類同名,并在名稱前面加上一個“~”符號。每一個類只有唯一的一個析構(gòu)函數(shù),沒有任何參數(shù),也不返回任何值,也不能被重載。例如:

classCStuScore { public: ... ~CStuScore() { } //析構(gòu)函數(shù)

...}

同樣,如果一個類中沒有定義析構(gòu)函數(shù)時,則編譯系統(tǒng)也會為類自動生成一個默認(rèn)析構(gòu)函數(shù),其格式如下(以類CStuScore為例):

~CStuScore() //默認(rèn)析構(gòu)函數(shù)的形式

{}需要說明的是,析構(gòu)函數(shù)只有在下列兩種情況下才會被自動調(diào)用:

(1)

當(dāng)對象定義在一個函數(shù)體中,該函數(shù)調(diào)用結(jié)束后,析構(gòu)函數(shù)被自動調(diào)用。

(2)

用new為對象分配動態(tài)內(nèi)存后,當(dāng)使用delete釋放對象時,析構(gòu)函數(shù)被自動調(diào)用。

2.2類的成員及特性2.2.3對象成員初始化 構(gòu)造函數(shù)定義格式:

<類名>::<構(gòu)造函數(shù)名>(形參表):對象1(參數(shù)表),對象2(參數(shù)表),…,對象n(參數(shù)表) {…… }

對象1、對象2、…、對象n就是該類使用的其他類的對象,冒號“:”后面的列表稱為成員初始化列表。說明:(1)

類的對象成員必須初始化,但不能將對象成員直接在構(gòu)造函數(shù)體內(nèi)進(jìn)行初始化,例如下面的初始化是不可以的:

CRect(intleft,inttop,intright,intbottom) { ptCenter=CPoint((left+right)/2,(top+bottom)/2); size=CSize(right-left,bottom-top);}(2)

對象成員初始化時,必須有相應(yīng)的構(gòu)造函數(shù),且多個對象成員的構(gòu)造次序不是按初始化成員列表的順序,而是按各類聲明的先后次序進(jìn)行的,從上例的運(yùn)行結(jié)果可以得到證明。(3)

對象成員初始化也可在類構(gòu)造函數(shù)定義時進(jìn)行。(4)事實(shí)上,成員初始化列表也可用于類中的普通數(shù)據(jù)成員的初始化。

2.2類的成員及特性2.2.4常類型

常對象 常對象是指對象常量,定義格式:<類名>const<對象名>

定義常對象時要進(jìn)行初始化,并且該對象不能再被更新,修飾符const可以放在類名后面,也可以放在類名前面。

常成員函數(shù)

使用const關(guān)鍵字進(jìn)行聲明的成員函數(shù)。只有常成員函數(shù)才有資格操作常量或常對象。說明格式: <類型說明符><函數(shù)名>(<參數(shù)表>)const;

const是加在函數(shù)聲明后面的類型修飾符,它是函數(shù)類型的一個組成部分,因此在函數(shù)實(shí)現(xiàn)部分也要帶const關(guān)鍵字。常成員函數(shù)還可以理解為一個“只讀”函數(shù),它不能更改數(shù)據(jù)成員的值,也不能調(diào)用那些引起數(shù)據(jù)成員值變化的成員函數(shù),只能調(diào)用const成員函數(shù)。

常數(shù)據(jù)成員 類型修飾符const不僅可以說明成員函數(shù),也可以說明數(shù)據(jù)成員。由于const類型對象必須被初始化,并且不能更新,因此,在類中聲明const數(shù)據(jù)成員后,只能通過構(gòu)造函數(shù)成員初始化方式來對常數(shù)據(jù)成員初始化。

2.2類的成員及特性2.2.5this指針

類中總有一個特殊的指針this,它指向類自己。該指針可以在類中訪問類的成員變量和成員函數(shù)。但在實(shí)際運(yùn)用中,一般不需要顯式地使用this指針來引用成員。

[例Ex_This]this指針的使用。

#include<iostream.h> classCOne { public: COne() {x=y=0;} COne(inta,intb) {x=a; y=b;} //對象引用作函數(shù)參數(shù)

voidcopy(COne&a); voidprint() {cout<<x<<","<<y<<endl;} private: intx,y;}; voidCOne::copy(COne&a) { if(this==&a)return; *this=a;}

voidmain() { COneone,two(3,4); one.print(); one.copy(two); one.print();}

運(yùn)行結(jié)果:

0,0 3,4

函數(shù)copy代碼中,*this=a;是將形參a獲

溫馨提示

  • 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

提交評論