版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章類型與聲明
3.1類型3.2C++中的基本數(shù)據(jù)類型3.3void類型3.4枚舉類型3.5類型的聲明與定義3.6類型轉(zhuǎn)換小結(jié)練習(xí)題3.1類型
類型是C++?語(yǔ)言的核心概念之一。掌握一種語(yǔ)言的關(guān)鍵在于準(zhǔn)確、深刻地理解語(yǔ)言的類型(Type/Class)。本章通過(guò)介紹C++幾種典型的類型,來(lái)建立類型和聲明這兩個(gè)基本概念。
在程序設(shè)計(jì)語(yǔ)言中,一個(gè)數(shù)據(jù)類型(DataType)被定義為:
(1)一個(gè)值的集合,即類型的值域。每一種類型的量只能在其值域內(nèi)取值。
(2)一個(gè)作用于值集上的操作集,即每一種類型都有其相應(yīng)的操作集,并且該操作集封閉于值集。
C++是一種強(qiáng)類型語(yǔ)言,因此在用C++語(yǔ)言書寫的任何一個(gè)程序中,所出現(xiàn)的每一個(gè)標(biāo)識(shí)符(Identifier),如變量(Variable)、常量(Constant)、函數(shù)(Function)、字面值(Literal)、
運(yùn)算符/操作符(Operator)以及以上元素的合法組合,如表達(dá)式(Expression)等,都具有特定的類型。
在一個(gè)程序中,每種類型都有著相互不同的類型名。
一個(gè)類型具有如下的作用:
(1)決定變量/對(duì)象/常量的合法取值范圍(一個(gè)類型表征了一個(gè)值集(ASetofValues));
(2)決定合法的(一般是用運(yùn)算符或函數(shù)表示的)操作的范圍(一個(gè)類型表征了一個(gè)操作集(ASetofOperations));
(3)決定變量的存儲(chǔ)空間的大小;
(4)區(qū)分名字相同、類型不同的符號(hào)(如變量、函數(shù)、運(yùn)算符等);
(5)決定將一種類型的值能否及如何轉(zhuǎn)換成另一種類型的值;
(6)為編譯程序提供依據(jù),令其檢查出程序中的一部分錯(cuò)誤。
考慮如下的C++代碼:
//符號(hào)的定義(聲明):
floatx;
inty=7;
floatf(int);
//符號(hào)的使用:
x=y+f(2);
上述代碼片斷中,int、float為類型名,x、y為變量名,f為函數(shù)名,7和2為字面值常量,y+f(2)為表達(dá)式,+、=、()為操作符。
上述元素(變量、函數(shù)名、字面值、操作符、表達(dá)式)都具有特定的類型。
C++語(yǔ)言內(nèi)置了一組基本類型,它們對(duì)應(yīng)著機(jī)器的基本存儲(chǔ)單元和使用這些單元保存數(shù)據(jù)的常用方式。C++語(yǔ)言內(nèi)置的基本類型如下:
bool,布爾類型;
char,字符類型;
int,整數(shù)類型;
float,浮點(diǎn)類型;
void,空類型。
除此之外,C++允許用戶自定義枚舉(enum)類型。
另外,C++還允許用戶利用已有的類型構(gòu)造出:
指針類型,如int*;
數(shù)組類型,如float[];
引用類型,如double&;
結(jié)構(gòu)和類(用戶自定義)類型,如structA和classB。
在C++中,布爾、字符和整數(shù)類型統(tǒng)稱為整數(shù)類型(IntegralType),因?yàn)樗鼈兊臋C(jī)內(nèi)表示一致,都為整數(shù)。整型和浮點(diǎn)型統(tǒng)稱為算術(shù)類型(ArithmeticType),因?yàn)樵擃愋偷牧恳话阌糜谒阈g(shù)運(yùn)算。枚舉、結(jié)構(gòu)和類統(tǒng)稱為用戶自定義類型(User-DefinedType),因?yàn)檫@些類型須由用戶自行定義,之后才能在程序中使用。
C++所支持的數(shù)據(jù)類型如圖3.1所示。圖3.1C++語(yǔ)言支持的數(shù)據(jù)類型在C++語(yǔ)言中,對(duì)整型和浮點(diǎn)類型又提供了若干子類型。如在C++中整型又可分為一般的整型,如int;長(zhǎng)整型,如longint;無(wú)符號(hào)整型,如unsignedint等。浮點(diǎn)類型亦分為單精度浮點(diǎn)型,如float;雙精度浮點(diǎn)型,如double。之所以將類型又細(xì)分為若干子類,其目的是在存儲(chǔ)空間的大小、表示精度和取值范圍等方面給C++程序員提供一種選擇的機(jī)會(huì)。事實(shí)上,當(dāng)我們構(gòu)造一個(gè)程序時(shí),首先就是利用該語(yǔ)言所提供的各種基本類型或用戶自定義類型(基本類型的量使用的頻度最高)將問(wèn)題域中的概念在程序中描述出來(lái),進(jìn)而再利用這些類型量對(duì)其進(jìn)行相應(yīng)的操作,最終求得問(wèn)題域中的解。因此,當(dāng)我們把問(wèn)題域中的概念描述得非常精確時(shí),其結(jié)果勢(shì)必精確;反之,其結(jié)果將大大偏離我們的期望。從類型的角度出發(fā)構(gòu)建程序的過(guò)程,其實(shí)就是構(gòu)造與完善程序中類型系統(tǒng)的過(guò)程。因此,深刻地理解與掌握類型的概念及C++中的類型機(jī)制,對(duì)我們編寫優(yōu)秀的C++程序?qū)⑵鸬街陵P(guān)重要的作用。
3.2C++中的基本數(shù)據(jù)類型
C++語(yǔ)言提供了以下類別的基本類型:bool(布爾類型)、char(字符類型)、int(整數(shù)類型)、float(浮點(diǎn)類型)和void(空類型)。
3.2.1布爾類型
C++中布爾類型的類型名為bool,其值集為{true,false}。
一個(gè)布爾類型的量可以進(jìn)行算術(shù)運(yùn)算和邏輯運(yùn)算。在進(jìn)行算術(shù)和邏輯運(yùn)算時(shí),布爾類型的字面值true和false將分別被轉(zhuǎn)換成(機(jī)器中)整數(shù)類型的值1和0,程序中的非零值代表true,0為false。在程序中,布爾類型主要有以下用途:
(1)定義那些表達(dá)邏輯運(yùn)算(LogicalOperation)結(jié)果的變量,如:
voidf(inta,intb)
{
boolb1=a==b;
//測(cè)試a是否等于b,若相等,
則b1=true
//…
}
(2)作為函數(shù)(用于測(cè)試某些條件——一種謂詞(aPredicate))的返回類型,如:/*用于測(cè)試文件是否能被正確打開,若打開,則函數(shù)的返回值為true;
否則為false*/
boolis_open(File*);
//用于測(cè)試a是否大于b,若是,則函數(shù)的返回值為
true,否則為false
boolgreater(inta,intb)
{
returna>b;
}如上所述,C++規(guī)定:布爾類型的量在參加算術(shù)或邏輯運(yùn)算時(shí),其值自動(dòng)轉(zhuǎn)換成整型量參加運(yùn)算,true轉(zhuǎn)換成1,false轉(zhuǎn)換為0。例:值得注意的是,在C++中,指針類型亦可隱式地轉(zhuǎn)換為布爾類型,非空指針轉(zhuǎn)換為true,空指針轉(zhuǎn)換為false。3.2.2字符類型
C++中字符類型共有三類,它們是:
char(unsignedchar),無(wú)符號(hào)的字符類型;
signedchar,有符號(hào)字符類型,表示字符的最高位為符號(hào)位;
wchar_t,寬字符類型,用以支持Unicode字符集。
char類型和signedchar類型的值集為ASCII字符集(ISO646標(biāo)準(zhǔn)),共有256個(gè)字符。
wchar_t類型的值集為Unicode字符集(ISO10646標(biāo)準(zhǔn)),共有65536個(gè)字符。
char類型量的存儲(chǔ)空間一般是一個(gè)字節(jié)(1byte,8bits)。字符類型的量可以進(jìn)行算術(shù)運(yùn)算和邏輯運(yùn)算。此時(shí),字符類型的每個(gè)值被轉(zhuǎn)換成對(duì)應(yīng)的一個(gè)整數(shù),即對(duì)應(yīng)字符集的碼值(char類型為0~255,signedchar類型為-128~127)。
字符字面值的類型為char,它是用單引號(hào)括起來(lái)的單個(gè)字符,或者是用單引號(hào)括起來(lái)、前加轉(zhuǎn)義符?\?的單個(gè)字符,如?'\t','\n'?等,或?yàn)?'\ddd'(ddd為3位八進(jìn)制數(shù),如?'\263'?表示字符?|?)及?'\xhh'?(hh為兩位十六進(jìn)制數(shù),如\xfb表示字符√)。C++的轉(zhuǎn)義字符常用來(lái)表示一些不可打印的特殊字符,表3.1列出了C++中常用的一些轉(zhuǎn)義字符。表中的雙引號(hào)、單引號(hào)和反斜線本來(lái)是可打印字符,但由于它們?cè)贑++語(yǔ)言中具有特定的含意,所以當(dāng)把它們作為字符使用時(shí),須用轉(zhuǎn)義字符的形式表示。另外,用轉(zhuǎn)義字符形式可表示任意的可輸出字符、專用字符、圖形字符和控制字符等。
由于歷史的原因,C++中保留了C中的有符號(hào)字符類型,但建議一般情況下不要采用這種字符類型,因?yàn)槿羰褂貌划?dāng),它們?cè)诔绦蛑袑?huì)有十分奇異的表現(xiàn)。如?‘\263’?若為signedchar類型,當(dāng)按整型輸出時(shí),其值為-77。寬字符wchar_t類型的字面值由一對(duì)單引號(hào)括起來(lái)的雙字符后加L構(gòu)成,如?'cd'?L。若char(unsignedchar)或signedchar存儲(chǔ)空間的大小為一個(gè)字節(jié),則wchar_t類型就為兩個(gè)字節(jié)。下面的代碼片斷說(shuō)明了字符類型量的一般使用方法。
char?c;
unsignedchartab=‘\t’;
boolb;
c=‘A’;
b=c==‘A’;
//true
b=c==tab;
//false
b=(c+1)==‘B’;
//true
b=c>'a'; //false3.2.3整數(shù)類型
C++的整數(shù)類型(整型)共分為三類,即:
int(signedint)、unsignedint,一般的有符號(hào)/無(wú)符號(hào)整型;
short(signedshort)、unsignedshort,有符號(hào)/無(wú)符號(hào)短整型;
long(signedlong)、unsignedlong,有符號(hào)/無(wú)符號(hào)長(zhǎng)整型。
整數(shù)類型的值集為整數(shù)集合的子集。
整數(shù)類型值的存儲(chǔ)空間大小與具體的平臺(tái)(Platform,通常指特定的機(jī)器和操作系統(tǒng))相關(guān),典型的存儲(chǔ)空間分配量是short:2字節(jié);int:4字節(jié);long:8字節(jié)。整數(shù)類型的量可以進(jìn)行算術(shù)運(yùn)算和邏輯運(yùn)算。
整數(shù)類型字面值是由+/-號(hào)和數(shù)字組成的串。其字面值共分三類:十進(jìn)制,僅由+/-號(hào)、數(shù)字0~9構(gòu)成;八進(jìn)制,僅由+/-號(hào)、前導(dǎo)符0、數(shù)字0~7構(gòu)成;十六進(jìn)制,僅由+/-號(hào)、前導(dǎo)符0x/0X及數(shù)字0~9、字符a~f/A~F構(gòu)成。字面值前加0為八進(jìn)制數(shù),前加0x/0X為十六進(jìn)制數(shù);后加U為無(wú)符號(hào)整數(shù)字面值,后加L(l)為長(zhǎng)整型字面值。一個(gè)整型量的字面值默認(rèn)為十進(jìn)制。例如:
十進(jìn)制整型數(shù) 0283
八進(jìn)制整型數(shù) 00020123(分別對(duì)應(yīng)于上述三個(gè)十進(jìn)制數(shù))十六進(jìn)制整型數(shù) 0x00x20x53(分別對(duì)應(yīng)于上述三個(gè)十進(jìn)制數(shù))
下面的代碼片斷說(shuō)明了各類整型量的一般使用方法。
inti,j,k;
longn=123456789L;
unsignedshorts;
i=0x53; //i的值為十進(jìn)制83
j=i-010; //j的值為83-8=75
n=n-i+j;
s=1; //s的值為0000000000000001(二進(jìn)制)
s=s<<3; //左移三位后s為0000000000001000
k=s; //k的值為8
如上所述,在C++?中提供了各種類別的整型,但在應(yīng)用中一定要注意恰當(dāng)?shù)剡x取與使用它們。無(wú)符號(hào)整型較理想的情況是用于表示位數(shù)組(BitArray,如一組由0、1表示的開關(guān)量),試圖用無(wú)符號(hào)整型表示具有更大值域的整型量(較有符號(hào)整型量而言)往往是得不償失的。另外,在實(shí)際的程序代碼中,常常采用八進(jìn)制/十六進(jìn)制字面值表示與機(jī)器相關(guān)的位模式(BitPattern,如某一內(nèi)存地址值等),若用它們表示一般的整數(shù)值,則不僅易導(dǎo)致程序錯(cuò)誤,而且使得代碼的可讀性大大降低。3.2.4浮點(diǎn)類型
C++中浮點(diǎn)類型共分為三個(gè)子類,它們是:
float,單精度浮點(diǎn)型;
double,雙精度浮點(diǎn)型;
longdouble,長(zhǎng)雙精度浮點(diǎn)型。
浮點(diǎn)數(shù)類型的值集為實(shí)數(shù)集合的子集。
浮點(diǎn)數(shù)類型的變量/值的存儲(chǔ)空間與平臺(tái)相關(guān)。單精度、雙精度和長(zhǎng)雙精度浮點(diǎn)型的值域和精度由具體的實(shí)現(xiàn)確定,但每一種具體的實(shí)現(xiàn)都要保證:?jiǎn)尉雀↑c(diǎn)型的值域<雙精度浮點(diǎn)型的值域≤長(zhǎng)雙精度浮點(diǎn)型的值域
單精度浮點(diǎn)型的精度<雙精度浮點(diǎn)型的精度≤長(zhǎng)雙精度浮點(diǎn)型的精度
例如,在VC6.0環(huán)境下三種類別的浮點(diǎn)型量的值域與精度如表3.2所示。
C++為程序員進(jìn)行精確的數(shù)字計(jì)算提供了上述三種類別的浮點(diǎn)類型。在編程時(shí)應(yīng)根據(jù)應(yīng)用要求,在值域與精度上注意正確、適當(dāng)?shù)剡x取合適的浮點(diǎn)類型。對(duì)于一般的數(shù)字計(jì)算而言,double類型足矣。
浮點(diǎn)類型的量可以進(jìn)行算術(shù)運(yùn)算和邏輯運(yùn)算。
浮點(diǎn)數(shù)字面值是由+/-、小數(shù)點(diǎn)、數(shù)字和e(表示指數(shù))組成的串,后加f或F為float類型,后加l或L為longdouble類型,后面什么也不加默認(rèn)(Default)為double類型。下面就是一些浮點(diǎn)型字面值:
1.34,.78,1.2e10,5.78E-14,2.7f,2.0L,3.4e-3L計(jì)算機(jī)發(fā)明的初衷就是用于計(jì)算,力圖將人們從繁重的計(jì)算中解脫出來(lái)。今天,計(jì)算仍是計(jì)算機(jī)應(yīng)用的一個(gè)重要領(lǐng)域,所以應(yīng)用中仍然存在著大量的計(jì)算問(wèn)題。在采用浮點(diǎn)型量進(jìn)行計(jì)算時(shí)必須注意以下三個(gè)問(wèn)題:
(1)精度與誤差的問(wèn)題。計(jì)算時(shí),為了保證計(jì)算的精度與誤差滿足需求,首先必須恰當(dāng)?shù)剡x取C++?提供的浮點(diǎn)類型。另外,根據(jù)浮點(diǎn)數(shù)的存儲(chǔ)原理,應(yīng)用中應(yīng)牢記:浮點(diǎn)型量其值愈大,機(jī)內(nèi)表示的精度會(huì)愈低;反之,值愈小,精度會(huì)愈高。故在進(jìn)行一批浮點(diǎn)量的求和運(yùn)算時(shí)(如在銀行系統(tǒng)中求用戶利息的總和),我們應(yīng)將浮點(diǎn)數(shù)自小向大求和,而不是進(jìn)行反序操作,以免精度的損失與誤差的增大。
(2)判相等問(wèn)題。浮點(diǎn)數(shù)在機(jī)內(nèi)是近似表示的,故永遠(yuǎn)不要對(duì)浮點(diǎn)型量進(jìn)行判相等操作!因?yàn)閮蓚€(gè)“相等的”浮點(diǎn)型量永遠(yuǎn)也不可能相等,所以判相等將導(dǎo)致程序的死循環(huán)。正確的做法是:判兩者的差是否滿足誤差要求。假定我們欲判斷a和b是否相等,可采取如下的方式:
boolis_equal(floata,floatb)
{
if(abs(a-b)<=1.0e-6)returntrue;
elsefalse;
}
(3)整數(shù)與浮點(diǎn)數(shù)、各類浮點(diǎn)數(shù)之間進(jìn)行轉(zhuǎn)換時(shí)的問(wèn)題。C++允許各種基本類型的量進(jìn)行混合運(yùn)算(如算術(shù)和賦值運(yùn)算),并在運(yùn)算時(shí)系統(tǒng)會(huì)自動(dòng)進(jìn)行隱式類型轉(zhuǎn)換。因此在進(jìn)行整數(shù)與浮點(diǎn)數(shù)、各類浮點(diǎn)數(shù)之間的混合運(yùn)算時(shí),要注意精度與值的損失問(wèn)題。例:
longn=123456789L;
floatf,a,b;
doubled;
longdoubled2;
f=1234567.89f;
d2=f/1.23e5L; //1234567.89/123000.0
d=n+1000000L; //d的小數(shù)部分未必為0
f=f+0.0000001; //精度的限制可能使f的值不變
a=1.0e49; //值與精度損失
b=3.1415926535897896; //3.1415926535897896為double類型,精度損失3.2.5C++數(shù)據(jù)類型存儲(chǔ)量的大小
類型的作用之一是決定應(yīng)當(dāng)為變量分配的存儲(chǔ)空間,而存儲(chǔ)空間對(duì)于某些類型(如整數(shù)類型、浮點(diǎn)數(shù)類型等)來(lái)說(shuō)又決定了它的值集。
C++是一種與平臺(tái)相關(guān)的語(yǔ)言,每種數(shù)據(jù)類型存儲(chǔ)量的大小與具體的實(shí)現(xiàn)相關(guān)。
不論在具體平臺(tái)上各類型實(shí)際分配量是多少,C++都把分配給一個(gè)char類型值的存儲(chǔ)空間量作為存儲(chǔ)空間分配的基本單位量,其它類型值的存儲(chǔ)空間分配量都是這個(gè)基本單位量的整數(shù)倍。為了程序的可移植性,C++提供了sizeof運(yùn)算符(sizeof(類型名))來(lái)求得某一特定類型在給定平臺(tái)上存儲(chǔ)空間的大小(所占內(nèi)存字節(jié)數(shù))。例如在VC6.0環(huán)境下:
sizeof(int)=4
sizeof(float)=4
sizeof(double)=8
我們?cè)趯懗绦驎r(shí),要注重程序的可移植性(Portability),避免與特定平臺(tái)的存儲(chǔ)空間分配規(guī)則密切相關(guān)。
一種有效的做法是:用操作符sizeof來(lái)獲得特定類型的存儲(chǔ)空間分配量,而不是用整數(shù)類型字面值直接表示。例:雖然具體的存儲(chǔ)空間分配量與平臺(tái)相關(guān),但C++?標(biāo)準(zhǔn)規(guī)定,C++中各種基本類型的大小應(yīng)始終滿足如下關(guān)系:
1
sizeof(char)≤sizeof(short)≤sizeof(int)≤sizeof(long)
1≤sizeof(bool)≤sizeof(long)
sizeof(char)≤sizeof(wchar_t)≤sizeof(long)
sizeof(float)≤sizeof(double)≤sizeof(longdouble)
sizeof(N)
sizeof(signedN)
sizeof(unsignedN)
其中,N為整型或字符類型名。
3.3void類型
空類型名為void。void類型的值集為(空集)。
C++中的void類型一般只用于兩個(gè)目的:一是用來(lái)表示不返回值的函數(shù)/過(guò)程,其返回類型為void類型,稱為假/偽返回類型(PseudoReturnType);二是構(gòu)造出不限制所指對(duì)象類型的指針類型(void*),用來(lái)指向類型不限或類型不可預(yù)知的對(duì)象。注意:沒有void類型的對(duì)象。例:
voidx;
//錯(cuò)誤!?沒有void類型的變量
voidf();
//函數(shù)f不返回值
void*pv;//pv用于指向類型不限或不可預(yù)知的對(duì)象
采用void類型,我們可寫出彈性較大、抽象程度較高的函數(shù)或程序。void類型的高級(jí)應(yīng)用我們將在后續(xù)章節(jié)中敘述與展示。
3.4枚舉類型
枚舉(Enumeration)類型是用戶以枚舉(即一一列舉)值集的方式定義的一種類型。
枚舉值集表中的每個(gè)元素都是一個(gè)已命名的整數(shù)常量(NamedIntegerConstant),該整數(shù)常量就是枚舉類型的一個(gè)字面值,亦稱枚舉符(Enumerator)。
例如,下面定義了兩個(gè)枚舉類型keyword與summer_month:
//枚舉符若不指明對(duì)應(yīng)的整數(shù)值,則從0開始遞增,即ASM=0,AUTO=1,BREAK=2
enumkeyword{ASM,AUTO,BREAK};值得注意的是:
(1)定義的每一種枚舉類型都是不同的類型,如上述定義的e1、e2和e3分別為三個(gè)不同的類型。
(2)同一程序中不同枚舉類型的枚舉表中不能含有同樣的枚舉符,下述定義就是不相容的:
enumcolor{white,black};
enumflag{red,white,green};//兩種枚舉類型中有相
同的枚舉符white枚舉類型的主要用途是以易于理解、易于控制的方式表示程序中需要區(qū)分的狀態(tài)。程序中采用枚舉量而非直接采用一些整數(shù)字面值(如0,1等)表示一些條件判斷開關(guān)量,不僅減少了程序發(fā)生錯(cuò)誤的可能性,而且給代碼維護(hù)人員和編譯器提供了了解程序員意圖的線索。
例如,假定我們有一段處理程序員求職的程序代碼,下述實(shí)現(xiàn)方式就是既不容易理解、也不容易控制的狀態(tài)表示:
3.5類型的聲明與定義
C++規(guī)定:一個(gè)名字(或稱標(biāo)識(shí)符)能夠在一個(gè)C++程序中使用之前,必須先聲明這個(gè)名字。這就是說(shuō),必須指明這個(gè)名字的類型等信息,以通知編譯程序這個(gè)名字所指的是哪一種類型的實(shí)體。
C++中,聲明分為定義聲明和非定義聲明兩種。
定義聲明為所定義的名字進(jìn)行的動(dòng)作是:
確定類型;
分配存儲(chǔ)空間;
綁定(Binding,由編譯程序?qū)⒁粋€(gè)名字與和它對(duì)應(yīng)的存儲(chǔ)空間關(guān)聯(lián)在一起的動(dòng)作);
按照語(yǔ)言既定的缺省值(DefaultValue)或者聲明中給出的初始化值(如果有的話)設(shè)置對(duì)應(yīng)變量的初值(InitialValue)。
以上這些動(dòng)作統(tǒng)稱為對(duì)應(yīng)類型的一次實(shí)例(Instance)生成。定義聲明也可以用來(lái)定義新的類型或者新的類型名。
非定義聲明是為那些還沒有定義聲明(或者在其它地方已定義聲明)卻需要在這里使用的名字進(jìn)行“先承認(rèn)再核實(shí)”(提交編譯器核實(shí))的聲明。
在C++中,用戶定義的所有名字都必須有對(duì)應(yīng)的定義聲明。例:
//定義聲明
//定義新的類型:
structDate{intd,m,y;};
enumBeer{Tsingtao,Hans,Baoji};
//定義新的類型名:
typedefvoid*ent;
//定義變量、常量和函數(shù)
charch,*chp;
inti,count=1;
constdoublePI=3.1415926;
intDay(Date*p){returnp->d;}
//非定義聲明
//需超前引用
doublesqrt(double);
structUser;
//外部變量
externinterror_number;
//外部函數(shù)
externdoublegetBeerPrice(Beer);3.5.1聲明的語(yǔ)法規(guī)則
C++中的一個(gè)聲明由四部分組成:可選的“描述符”、類型名、標(biāo)識(shí)符(變量/對(duì)象/函數(shù)/模塊名(表列))和一個(gè)可選的初始化表達(dá)式。除了函數(shù)和名字空間(Namespace)外,聲明都應(yīng)以分號(hào)結(jié)束。
聲明結(jié)構(gòu)中的可選描述符,如virtual、extern、static、typedef等用以說(shuō)明被聲明對(duì)象(標(biāo)識(shí)符)的某些非類型的屬性(virtual、static和typedef的含義見后續(xù)章節(jié)內(nèi)容)。
聲明結(jié)構(gòu)中還可使用若干個(gè)聲明運(yùn)算符,這些聲明運(yùn)算符可放置在類型名后或標(biāo)識(shí)符前。聲明運(yùn)算符用于進(jìn)一步表征所聲明對(duì)象的類別,C++中常用的聲明運(yùn)算符見表3.3。一個(gè)聲明中,類型名及標(biāo)識(shí)符是兩個(gè)必需的部分。聲明語(yǔ)句的正確使用如下例所示:
inti=0;//定義聲明一個(gè)整型變量并初始化
int&xi=i;//定義聲明一個(gè)整型變量i的引用
float*pf;//定義聲明一個(gè)指向浮點(diǎn)類型對(duì)象的指針變量
int*constpi;//定義聲明一個(gè)指向整型對(duì)象的常量指針
char*color[]={“red”,“green”,“blue”};//定義聲明一個(gè)字
符指針數(shù)組并初始化
intgt(inta,intb){returna>b?a:b;} //定義聲明一個(gè)整型
函數(shù)
constc=13;//錯(cuò)誤!聲明中沒有類型名
C++規(guī)定:一條定義聲明語(yǔ)句可同時(shí)聲明多個(gè)變量/對(duì)象,它們以逗號(hào)相隔,但注意聲明運(yùn)算符只作用于一個(gè)變量/對(duì)象名。例如:
int*pi,y; //等價(jià)于int*pi;inty;
intv[20],*pv; //等價(jià)于intv[20];int*pv;
在一條聲明語(yǔ)句中同時(shí)聲明多個(gè)變量/對(duì)象,易導(dǎo)致程序錯(cuò)誤而且使其代碼的可讀性大大降低,除非在一條聲明語(yǔ)句中同時(shí)聲明多個(gè)同類別的變量/對(duì)象時(shí)才不妨一試這種結(jié)構(gòu)。另外,在定義聲明一個(gè)變量/對(duì)象時(shí),應(yīng)注意立即對(duì)其進(jìn)行初始化。局部變量/對(duì)象若不進(jìn)行初始化,則其值為一“隨機(jī)數(shù)”(不可預(yù)知的值)。采用未初始化的變量/對(duì)象常常是導(dǎo)致程序發(fā)生錯(cuò)誤的罪魁禍?zhǔn)住?.5.2C++中的標(biāo)識(shí)符
C++中的標(biāo)識(shí)符必須符合如下命名規(guī)則:
一個(gè)標(biāo)識(shí)符必須是一個(gè)字母/下劃線(_)/數(shù)字的串,其首字符必須是字母,下劃線在C++中被認(rèn)為是一個(gè)字母;
C++
標(biāo)準(zhǔn)中對(duì)標(biāo)識(shí)符的長(zhǎng)度不限,但具體的機(jī)器對(duì)標(biāo)識(shí)符的長(zhǎng)度有限制;
C++?中的關(guān)鍵字(如類型名、語(yǔ)句名等,C++的關(guān)鍵字見表3.4)不能用作用戶標(biāo)識(shí)符,標(biāo)準(zhǔn)庫(kù)函數(shù)名、類名亦不能用作用戶標(biāo)識(shí)符;
從語(yǔ)法角度講,用戶標(biāo)識(shí)符可以下劃線開頭,但一般的C++實(shí)現(xiàn)中,把以下劃線開頭的標(biāo)識(shí)符保留為系統(tǒng)專用,故在程序中不宜起以下劃線開頭的標(biāo)識(shí)符名。
除了遵循C++所規(guī)定的語(yǔ)法規(guī)則外,在命名標(biāo)識(shí)符時(shí)建議遵循如下規(guī)則,它將使程序的可讀性和可維護(hù)性大大提高。這些規(guī)則包括:
程序中避免起形式上只有細(xì)微差別的標(biāo)識(shí)符名,如l0(數(shù)字0)與lo(字母o);
讓標(biāo)識(shí)符名反映其含義,使讀者能見名知義;
在一個(gè)應(yīng)用程序中,注意標(biāo)識(shí)符命名風(fēng)格的一致性;
對(duì)于符號(hào)常量名或宏名,全部采用大寫,多個(gè)單詞之間用下劃線分隔;
對(duì)于作用域較大的標(biāo)識(shí)符而言,其名字最好起得長(zhǎng)一些,而小范圍的標(biāo)識(shí)符為了方便應(yīng)盡可能短一些;
利用C++提供的自由的變量聲明機(jī)制,變量用時(shí)方聲明并立即初始化,并盡可能地縮小其作用域,以免程序中標(biāo)識(shí)符重名或程序發(fā)生錯(cuò)誤。
其他規(guī)則不一一敘述。
標(biāo)識(shí)符的命名是一種藝術(shù),更體現(xiàn)了編程者的風(fēng)格與品位!
ANSI/ISOC++草案標(biāo)準(zhǔn)提供了運(yùn)算符關(guān)鍵字,見表3.4中第三類C++運(yùn)算符關(guān)鍵字,它們可以代替一些C++運(yùn)算符。這些運(yùn)算符關(guān)鍵字可在不支持?!、&、^、~、|?等字符的鍵盤編程時(shí)使用。使用上述運(yùn)算符關(guān)鍵字必須包含頭文件<ciso646>。3.5.3標(biāo)識(shí)符的作用域
C++為提高資源的利用率,允許在不同的、確定的區(qū)域使用相同的名字。顧名思義,一個(gè)名字的作用域(Scope)即為該名字起作用的區(qū)域。
名字的作用域與函數(shù)和塊(Block)的結(jié)構(gòu)相關(guān)。C++用一對(duì)花括號(hào){}來(lái)標(biāo)識(shí)函數(shù)體的邊界和塊邊界。塊允許嵌套(Nesting)。
在函數(shù)內(nèi)、函數(shù)的參數(shù)表內(nèi)及塊內(nèi)定義的名字稱為局部(Local)量,即它們的作用域分別局限于函數(shù)或定義的塊內(nèi)。在函數(shù)之外定義的名字稱為全局(Global)量。變量的生命期/有效期(LifeCycle)由它的作用域來(lái)決定。
作用域規(guī)則:如果在一個(gè)函數(shù)或一個(gè)塊中定義了在其外已經(jīng)定義過(guò)的名字,則外部定義的名字在內(nèi)部被屏蔽(通常稱為名字隱藏機(jī)制);否則,外部定義的名字“透入”內(nèi)部。
在C++中,名字具有從外部“透入”內(nèi)部的機(jī)制,但注意:名字沒有從內(nèi)部“透出”到外部的機(jī)制。
還應(yīng)注意:C++的名字隱藏機(jī)制應(yīng)盡量避免使用,因?yàn)槭褂貌划?dāng)極易導(dǎo)致程序錯(cuò)誤,并使程序的可讀性大大降低。對(duì)于全局量,若用戶定義時(shí)未初始化,則系統(tǒng)自動(dòng)初始化為0。
正如上一節(jié)所提到的,對(duì)于全局量的命名應(yīng)盡可能長(zhǎng)一些。如果將一些全局量命名為x、y之類,經(jīng)驗(yàn)證明是自找麻煩!3.5.4typedef
聲明語(yǔ)句中的前綴描述符typedef的功能是為一個(gè)已存在的類型名起一個(gè)別名。其語(yǔ)法規(guī)則為
typedef老類型名新類型名;
下面展示typedef的用法,例:
typedefchar*Pchar;//為類型char*起別名為Pchar
Pcharp1,p2; //p1和p2為char*類型
typedefunsignedcharuchar; //將unsignedchar類型起
別名為uchar
C++中所提供的產(chǎn)生新的類型名(注意:不是產(chǎn)生新的類型
!
)的機(jī)制typedef主要用于兩個(gè)目的:
(1)將繁長(zhǎng)的類型名縮寫為較短的類型名以便于使用,如上例中的第三條語(yǔ)句。
(2)將對(duì)某一類型的直接引用限制到一個(gè)地方,使程序參數(shù)化,以利于程序的跨平臺(tái)移植。
如我們有如下定義語(yǔ)句:
typedefintint32;假定在某一特定的平臺(tái)上,sizeof(int)=4,有了上述的聲明語(yǔ)句,程序中我們直接用int32編碼,用其表示整數(shù)類型int。當(dāng)程序向另一平臺(tái)移植時(shí),假定該平臺(tái)sizeof(int)=2,sizeof(long)=4,則為了程序正確、可靠地移植,我
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 武漢城市學(xué)院《含油氣盆地沉積學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度ktv包間租賃與經(jīng)營(yíng)管理合同3篇
- 二零二五年度智慧醫(yī)療信息化建設(shè)合同6篇
- 二零二五年度校園內(nèi)快遞配送單位食品安全快速檢測(cè)設(shè)備升級(jí)合同3篇
- E省教育局辦公室復(fù)印紙直采協(xié)議(2024版)版B版
- 2024甲乙雙方關(guān)于新能源技術(shù)研發(fā)的獨(dú)家委托合同
- 二零二五年度物流配送監(jiān)事聘任與效率優(yōu)化合同3篇
- 天津城建大學(xué)《東西智慧與管理實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 太原城市職業(yè)技術(shù)學(xué)院《機(jī)電系統(tǒng)動(dòng)力學(xué)建模與仿真》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度純凈飲用水品牌重塑與營(yíng)銷推廣合同3篇
- 浙江省安全員C證考試題庫(kù)及答案(推薦)
- 《文化苦旅》讀書分享 PPT
- 氧化鋁生產(chǎn)工藝教學(xué)拜耳法
- 2023年十八項(xiàng)醫(yī)療核心制度考試題與答案
- 氣管切開患者氣道濕化的護(hù)理進(jìn)展資料 氣管切開患者氣道濕化
- 管理模板:某跨境電商企業(yè)組織結(jié)構(gòu)及部門職責(zé)
- 底架總組裝工藝指導(dǎo)書
- 簡(jiǎn)單臨時(shí)工勞動(dòng)合同模板(3篇)
- 聚酯合成反應(yīng)動(dòng)力學(xué)
- 上海科技大學(xué),面試
- 《五年級(jí)奧數(shù)總復(fù)習(xí)》精編課件
評(píng)論
0/150
提交評(píng)論