3.4.4 使用數(shù)組元素的成員函數(shù)
使用數(shù)組元素成員函數(shù)的方法是寫出數(shù)組元素,在后面跟上成員選擇運算符和成員函數(shù)名稱。聽起來有些復(fù)雜,其實不然,如下例所示:
cout << inventory[0].size() << " letters in it.\n";
代碼inventory[0].size()的意思是程序調(diào)用元素inventory[0]的成員函數(shù)size()。因為此處的inventory[0]是"battle axe",所以調(diào)用返回該string對象的字符個數(shù)10。
3.4.5 數(shù)組邊界
之前已經(jīng)介紹過,索引數(shù)組時要小心。因為數(shù)組的大小是固定的,所以可以創(chuàng)建一個整型常量存儲數(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.";
}
這段代碼首先檢測numItems是否小于MAX_ITEMS。如果小于,則可以安全地把numItems當(dāng)作索引號使用,并賦給數(shù)組一個新的string對象。在本例中,numItems為3,所以字符串"healing potion"賦給了數(shù)組的位置3。如果不滿足小于條件,則顯示消息“You have too many items and can't carry another.”。
那么,如果使用數(shù)組邊界以外的元素會怎樣?這要視情況而定,因為這是在使用計算機內(nèi)存中未知的部分。最壞的情況是,如果試圖給數(shù)組邊界外的元素賦值,將導(dǎo)致程序行為不可預(yù)測,甚至程序崩潰。
可以在使用索引號之前對其進(jìn)行測試,以確保它是合法的數(shù)組位置。這種做法叫做邊界檢查。如果要使用的索引可能不合法,那么邊界檢查是必不可少的。
3.5 理解C風(fēng)格字符串
有string對象之前,C++程序員使用以空字符結(jié)尾的字符數(shù)組表示字符串。這些字符數(shù)組現(xiàn)在稱為C風(fēng)格字符串,因為這種表示字符串的習(xí)慣是從C程序開始的。聲明和初始化C風(fēng)格字符串的方法和其他數(shù)組一樣:
char phrase[] = "Game Over!!!";
C風(fēng)格字符串以一個稱為空字符的字符結(jié)尾。空字符可以寫成'\0'。上面的代碼不需要使用空字符,因為它已經(jīng)存儲在字符串的結(jié)尾處。所以,從技術(shù)上而言,phrase有13個元素(然而,使用C風(fēng)格字符串的函數(shù)則認(rèn)為phrase的長度為12,這是合理的,并且與string對象的工作原理一致)。
至于其他任意類型的數(shù)組,可以在定義時指定數(shù)組大小。因此,聲明和初始化C風(fēng)格字符串的另一種方式是:
char phrase[81] = "Game Over!!!";
這行代碼創(chuàng)建了一個可以容納80個可打印字符的C風(fēng)格字符串(另外還有一個終止空字符)。
C風(fēng)格字符串沒有成員函數(shù),但是作為標(biāo)準(zhǔn)庫一部分的cstring文件中包含了各種使用C風(fēng)格字符串的函數(shù)。
string對象的優(yōu)點在于,它們被設(shè)計為可以和C風(fēng)格字符串很好地結(jié)合使用。例如,下面給出的都是C風(fēng)格字符串和string對象的合法用法:
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對象可以和C風(fēng)格字符串連接起來,但結(jié)果仍然是一個string對象(所以char phrase2[] = word1 + word2;會產(chǎn)生錯誤)。可以使用關(guān)系運算符比較string對象和C風(fēng)格字符串,甚至還可以將C風(fēng)格字符串用作string對象成員函數(shù)的實參。
C風(fēng)格字符串和數(shù)組有共同的缺點,其中最大的一個是它們的長度是固定的。因此,應(yīng)當(dāng)遵循的原則是:只要可能就使用string對象,但是如果有必要的話,需做好使用C風(fēng)格字符串的準(zhǔn)備。