C++ string使用for改变为何必须使用引用

来源:互联网 发布:阿里云2016年宕机 编辑:程序博客网 时间:2024/05/21 10:59

例子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中对象的字符的值,必须把循环变量定义成引用类型,如果是直接=,只是对原先对象的拷贝(即值的传递)。而想要去改变原始值,就要去获得其原始对象,所以使用引用。

0 0
原创粉丝点击