1. 程式人生 > >C++ string使用for改變為何必須使用引用

C++ string使用for改變為何必須使用引用

例子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中物件的字元的值,必須把迴圈變數定義成引用型別,如果是直接=,只是對原先物件的拷貝(即值的傳遞)。而想要去改變原始值,就要去獲得其原始物件,所以使用引用。