C++ string使用for改變為何必須使用引用
阿新 • • 發佈:2019-02-17
例子1:
#include <iostream>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main(){
string s("assss,ddd,eeee");
decltype(s.size()) punct_cnt = 0;
for(auto c : s){
if(ispunct(c)){
++punct_cnt;
}
}
cout << punct_cnt << endl;
}
一個普通的遍歷字串,輸出標點符號值為2
例子2:
當改變std::string 中的值
錯誤程式碼:
#include <iostream>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main(){
string s("assss,ddd,eeee");
decltype(s.size()) punct_cnt = 0;
for (auto c : s){
c = toupper(c);
}
cout << s << endl;
}
輸出assss,ddd,eeee
正確程式碼:
#include <iostream>
#include <cctype>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main(){
string s("assss,ddd,eeee");
decltype(s.size()) punct_cnt = 0 ;
for(auto &c : s){
c = toupper(c);
}
cout << s << endl;
}
輸出ASSSS,DDD,EEEE
結論:如果要改變string中物件的字元的值,必須把迴圈變數定義成引用型別,如果是直接=,只是對原先物件的拷貝(即值的傳遞)。而想要去改變原始值,就要去獲得其原始物件,所以使用引用。