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)備。