文章目錄
- string對象的初始化
- string::size_type類型
- string對象的讀寫操作
- 使用標準庫中的iostream
- 使用getline讀取一整行
- string對象的比較操作
- string對象的相加操作
- 兩個string對象相加
- 字面值和string對象相加
string對象的初始化
拷貝初始化(copy initialization):使用等號(=)初始化一個變量
直接初始化(direct initialization):不使用等號
當初始值只有一個時,使用兩種初始化都行。如果用到的初始值有多個,一般來說只能使用直接初始化的方式:
string s5 = "hiya"; // 拷貝初始化
string s6("hiya); // 直接初始化
string s7(10, 'c'); //直接初始化
非要用拷貝初始化的方式來處理多個初始值也不是不可以,不過需要顯式地創建一個(臨時)對象用于拷貝:
string s8 = string(10, ' c');
等價于:
string temp(10, ' c');
string s8 = temp; // 將temp拷貝給s8
盡管初始化s8的語句合法,但和初始化s7的方式比較起來可讀性較差,也沒有任何補償優勢,因此不建議采用。
string::size_type類型
string::size_type類型是szie函數(例如:empty函數、size函數)返回值的類型。是一個無符號類型的值,而且足夠存放下任何string對象的大小。
所有用于存放string類的size函數返回值的變量,都應該是string::size_type類型的。
由于size函數返回的是一個無符號整型數,因此如果在表達式中混用了帶符號數和無符號數將可能產生意想不到的結果。例如,假設n是一個具有負值的int,則表達式s.size()<n的判斷結果幾乎肯定是true。因為負值n會自動地轉換成一個比較大的無符號值。
PS:如果一條表達式中已經有了size()函數就不要再使用int了,這樣可以避免混用int和unsigned可能帶來的問題。
string對象的讀寫操作
使用標準庫中的iostream
執行讀取操作時,string對象會自動忽略開頭的空白(空格符、換行符、制表符等)并從第一個真正的字符開始讀起,直到遇見下一處空白為止。
例如:如果程序輸入:
hello world
則輸出將是:
hello
輸出結果中沒有任何空格。
使用getline讀取一整行
getline函數的參數是一個輸入流和一個string對象,函數從給定的輸入流中讀入內容,直到遇到換行符為止(換行符也被讀進來),然后把所讀的內容存入到那個string對象中去(不存換行符)。
getline只要一遇到換行符就結束讀取操作并返回結果,哪怕輸入的一開始就是換行符也是如此。如果輸入一開始就是換行符,那么所得的結果是個空string。
PS:觸發getline函數返回的那個換行符實際上被丟棄掉了,得到的string對象中并不包含該換行符。
string對象的比較操作
string對象相等意味著它們的長度相同、所包含的字符也全都相同。
檢驗兩個string對象之間關系的關系運算符都依照(大小寫敏感的)字典順序:
- 如果兩個string對象的長度不同,而且較短的string對象的每個字符都與較長string對象對應位置上的字符相同,就說較短string對象小于較長string對象。
- 如果兩個string對象在某些對應的位置上不一致,則string對象比較的結果其實是string對象中第一對相異字符比較的結果。
舉例:
string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
根據規則1可判斷,對象str小于對象phrase;根據規則2可判斷,對象slang大于phrase,那么同理也大于str。
string對象的相加操作
兩個string對象相加
兩個string對象相加得到一個新的string對象,其內容是把左側的運算對象與右側的運算對象串接而成。
string s1 = "hello,", s2 = "world\n";
string s3 = s1 + s2;
//s3的內容是hello,world\n
字面值和string對象相加
因為標準庫允許將字符字面值和字符串字面值轉換成string對象,所以string對象可以用這兩種字面值來替代。
string s1 = "hello", s2 = "world";string s3 = s1 + "," + s2 + '\n';
當將string對象和字面值混在一條語句中使用時,必須確保每個加法運算符的兩側的對算對象至少有一個是string:
string s4 = s1 + ","; // 正確
string s5 = "hello" + ","; // 錯誤:兩個運算對象都不是string
string s6 = s1 + "," + "world"; // 正確
string s7 = "hello" + "," + s2; // 錯誤
s6和s7的工作機理和連續輸入連續輸出是一樣的,可以用如下形式分組:
string s6 = (s1 + ",") + "world";
其中子表達式s1 + ","的結果是一個string對象,同時作為第二個加法運算符的左側運算對象,因此上述語句和下面的兩個語句是等價的:
string tmp = s1 + ",";
s6 = tmp + "world";
另一方面,s7的初始化是非法的,根據其語義加上括號后就成了下面的形式:
string s7 = ("hello" + ",") + s2;
很容易看到,括號內的子表達式試圖把兩個字符串字面值加在一起,而編譯器根本沒法做到這一點,所以這條語句是錯誤的。
PS:因為某些歷史原因,也為了與C兼容,所以C++語言中的字符串字面值并不是標準庫類型string對象。切記,字符串字面值和string是不同的類型。