一切的起因是string类的谜之初始化。
在写代码的时候,我发现即使没有用字符串初始化string对象,也可以对string对象进行下标操作,就像这样:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
s[0]='x';
s[1]='y';
cout<<"下标操作后的串s:"<<s;
cout<<"\n串s的长度:"<<s.length();
return 0;
}
在Dev C++上的运行结果:
可以看出,即使是下标从0
开始,操作后的子串仍然是空串。这说明上述赋值方法是有问题 错误的。
那么,应该如何正确地赋值呢?
可行的方式如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
s+='a';
s+="b";
s=s+'c';
cout<<"操作后的串s:"<<s<<endl;
s[0]='x';
s[1]='y';
cout<<"下标操作后的串s:"<<s;
cout<<"\n串s的长度:"<<s.length();
return 0;
}
值得注意的是,string类的加号重载后,也可以在原串末尾添加一个字符,如:
s+='a';
上述程序的运行结果也是很显然的:
当然,只有在已经有元素的部分才能使用下标操作改变元素的值。