正文

for循環(huán)、字符串與數(shù)組(11)

通過(guò)游戲編程實(shí)戰(zhàn)教新手學(xué)C++編程 作者:(美)Michael Dawson


3.4.4  使用數(shù)組元素的成員函數(shù)

使用數(shù)組元素成員函數(shù)的方法是寫出數(shù)組元素,在后面跟上成員選擇運(yùn)算符和成員函數(shù)名稱。聽起來(lái)有些復(fù)雜,其實(shí)不然,如下例所示:

cout << inventory[0].size() << " letters in it.\n";

代碼inventory[0].size()的意思是程序調(diào)用元素inventory[0]的成員函數(shù)size()。因?yàn)榇颂幍膇nventory[0]是"battle axe",所以調(diào)用返回該string對(duì)象的字符個(gè)數(shù)10。

3.4.5  數(shù)組邊界

之前已經(jīng)介紹過(guò),索引數(shù)組時(shí)要小心。因?yàn)閿?shù)組的大小是固定的,所以可以創(chuàng)建一個(gè)整型常量存儲(chǔ)數(shù)組的大小。程序的開頭部分就采取了這種做法:

const int MAX_ITEMS = 10;

下面代碼在給主人公添加物品之前使用MAX_ITEMS進(jìn)行數(shù)組保護(hù):

if (numItems < MAX_ITEMS)

{

inventory[numItems++] = "healing potion";

}

else

{

cout << "You have too many items and can’t carry another.";

}

這段代碼首先檢測(cè)numItems是否小于MAX_ITEMS。如果小于,則可以安全地把numItems當(dāng)作索引號(hào)使用,并賦給數(shù)組一個(gè)新的string對(duì)象。在本例中,numItems為3,所以字符串"healing potion"賦給了數(shù)組的位置3。如果不滿足小于條件,則顯示消息“You have too many items and can't carry another.”。

那么,如果使用數(shù)組邊界以外的元素會(huì)怎樣?這要視情況而定,因?yàn)檫@是在使用計(jì)算機(jī)內(nèi)存中未知的部分。最壞的情況是,如果試圖給數(shù)組邊界外的元素賦值,將導(dǎo)致程序行為不可預(yù)測(cè),甚至程序崩潰。

可以在使用索引號(hào)之前對(duì)其進(jìn)行測(cè)試,以確保它是合法的數(shù)組位置。這種做法叫做邊界檢查。如果要使用的索引可能不合法,那么邊界檢查是必不可少的。

3.5  理解C風(fēng)格字符串

有string對(duì)象之前,C++程序員使用以空字符結(jié)尾的字符數(shù)組表示字符串。這些字符數(shù)組現(xiàn)在稱為C風(fēng)格字符串,因?yàn)檫@種表示字符串的習(xí)慣是從C程序開始的。聲明和初始化C風(fēng)格字符串的方法和其他數(shù)組一樣:

char phrase[] = "Game Over!!!";

C風(fēng)格字符串以一個(gè)稱為空字符的字符結(jié)尾??兆址梢詫懗?\0'。上面的代碼不需要使用空字符,因?yàn)樗呀?jīng)存儲(chǔ)在字符串的結(jié)尾處。所以,從技術(shù)上而言,phrase有13個(gè)元素(然而,使用C風(fēng)格字符串的函數(shù)則認(rèn)為phrase的長(zhǎng)度為12,這是合理的,并且與string對(duì)象的工作原理一致)。

至于其他任意類型的數(shù)組,可以在定義時(shí)指定數(shù)組大小。因此,聲明和初始化C風(fēng)格字符串的另一種方式是:

char phrase[81] = "Game Over!!!";

這行代碼創(chuàng)建了一個(gè)可以容納80個(gè)可打印字符的C風(fēng)格字符串(另外還有一個(gè)終止空字符)。

C風(fēng)格字符串沒有成員函數(shù),但是作為標(biāo)準(zhǔn)庫(kù)一部分的cstring文件中包含了各種使用C風(fēng)格字符串的函數(shù)。

string對(duì)象的優(yōu)點(diǎn)在于,它們被設(shè)計(jì)為可以和C風(fēng)格字符串很好地結(jié)合使用。例如,下面給出的都是C風(fēng)格字符串和string對(duì)象的合法用法:

string word1 = "Game";

char word2[] = " Over";

string phrase = word1 + word2;

if (word1 != word2)

{

cout << "word1 and word2 are not equal.\n";

}

if (phrase.find(word2) != string::npos)

{

cout << "word2 is contained in phrase.\n";

}

string對(duì)象可以和C風(fēng)格字符串連接起來(lái),但結(jié)果仍然是一個(gè)string對(duì)象(所以char phrase2[] = word1 + word2;會(huì)產(chǎn)生錯(cuò)誤)??梢允褂藐P(guān)系運(yùn)算符比較string對(duì)象和C風(fēng)格字符串,甚至還可以將C風(fēng)格字符串用作string對(duì)象成員函數(shù)的實(shí)參。

C風(fēng)格字符串和數(shù)組有共同的缺點(diǎn),其中最大的一個(gè)是它們的長(zhǎng)度是固定的。因此,應(yīng)當(dāng)遵循的原則是:只要可能就使用string對(duì)象,但是如果有必要的話,需做好使用C風(fēng)格字符串的準(zhǔn)備。


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)