3.3.2 創(chuàng)建string對(duì)象
main()函數(shù)做的第一件事情就是以三種不同方式創(chuàng)建了三個(gè)字符串。
string word1 = "Game";
string word2("Over");
string word3(3, '!');
其中第一行簡(jiǎn)單地使用賦值運(yùn)算符創(chuàng)建string對(duì)象word1,這與之前見過的其他變量的賦值情況一樣。因此,word1的值為"Game"。
第二行創(chuàng)建word2的方式是將作為該變量值的string對(duì)象置于一對(duì)括號(hào)中。因此,word2的值為"Over"。
最后一行創(chuàng)建word3的方式是在一對(duì)括號(hào)中置入一個(gè)數(shù)后再加上一個(gè)字符。這樣生成的string對(duì)象由提供給它的字符組成,且長(zhǎng)度等于提供的數(shù)。因此,word3的值為"!!!"。
3.3.3 string對(duì)象的連接
接下來(lái),程序通過將前3個(gè)string對(duì)象連接起來(lái)創(chuàng)建新的string對(duì)象phrase:
string phrase = word1 + " " + word2 + word3;
因此,phrase的值為"Game Over!!!"。
注意+運(yùn)算符,以前它只是與數(shù)字一起使用,現(xiàn)在也可以用于連接string對(duì)象。這是因?yàn)?運(yùn)算符被重載了。運(yùn)算符重載重定義常見的運(yùn)算符,這樣在新的、原來(lái)未定義的上下文中,它會(huì)起到不同的作用。在這里,代碼中的+運(yùn)算符不是用于將值相加,而是用于連接string對(duì)象。之所以能這么做,是因?yàn)閟tring類型明確重載了+運(yùn)算符,并將其定義為當(dāng)用于字符串時(shí)進(jìn)行連接操作。
3.3.4 使用size()成員函數(shù)
現(xiàn)在介紹string的成員函數(shù)。下面的代碼使用了成員函數(shù)size():
cout << "The phrase has " << phrase.size() << " characters in it.\n\n";
phrase.size()通過成員選擇運(yùn)算符.(點(diǎn)號(hào))調(diào)用string對(duì)象phrase的成員函數(shù)size()。成員函數(shù)size()僅返回表示string對(duì)象大小(所包含的字符數(shù))的無(wú)符號(hào)整型值。因?yàn)閟tring對(duì)象是"Game Over!!!",該成員函數(shù)返回的值為12(每個(gè)字符都要計(jì)算在內(nèi),包括空格)。當(dāng)然,調(diào)用另一個(gè)string對(duì)象的size()返回的字符個(gè)數(shù)可能不一樣,這取決于該string對(duì)象中字符的個(gè)數(shù)。
提示
string對(duì)象還包含一個(gè)成員函數(shù)length(),同size()一樣,該函數(shù)返回string對(duì)象中字符的個(gè)數(shù)。
3.3.5 索引string對(duì)象
string對(duì)象存儲(chǔ)一個(gè)char型值的序列。給對(duì)象提供下標(biāo)運(yùn)算符([])和索引號(hào)就可以訪問其中的任意一個(gè)char型值。這是接下來(lái)將介紹的內(nèi)容:
cout << "The character at position 0 is: " << phrase[0] << "\n\n";
序列中第一個(gè)元素的位置為0。上面語(yǔ)句中的phrase[0]是字符G。因?yàn)橛?jì)數(shù)從0開始,所以雖然string對(duì)象中包含12個(gè)字符,但是它的最后一個(gè)字符是phrase[11]。
陷阱
經(jīng)常易犯的一個(gè)錯(cuò)誤就是忘記索引是從0開始的。記住,包含n個(gè)字符的string對(duì)象的索引是0~n-1。
不僅可以通過下標(biāo)運(yùn)算符訪問string對(duì)象中的字符,還可以對(duì)它們重新賦值,如下所示:
phrase[0] = 'L';
可以將phrase的第一個(gè)字符修改為字符L,這樣phrase就成了"Lame Over!!!"。
陷阱
當(dāng)使用string對(duì)象和下標(biāo)運(yùn)算符時(shí),C++編譯器不執(zhí)行邊界檢查。這意味著編譯器不檢查程序是否試圖訪問不存在的元素。訪問非法的序列元素可能導(dǎo)致災(zāi)難性的后果,因?yàn)檫@可能覆蓋掉計(jì)算機(jī)內(nèi)存中的關(guān)鍵數(shù)據(jù)。這樣可能導(dǎo)致程序崩潰,所以在使用下標(biāo)運(yùn)算符訪問數(shù)據(jù)時(shí)要小心。