我们都知道可以用已下方式来初始化string对象:
strings(“helloworld!”);
实际上我们也可以通过这样的方式来实现:
charc[]={‘h’,‘e’,‘l’,‘l’,‘o’,‘ ‘,‘w’,‘o’,‘r’,‘l’,‘d’,‘!’,‘\0’};
strings=c;
但是如果数组c不是以空字符结尾的话,那么上面的赋值就是不正确的。
实际上,任何出现字符串字面值(即上面的“helloworld!”这种形式)的地方都可以用以空字符结束的字符数组来替代。注意点如下:
1、可以使用以空字符结尾的字符数组来初始化string对象或者给string对象赋值
2、在string对象的加法运算中,可以使用以空字符结尾的字符数组作为其中一个运算对象,但是不能两个都是。在string的加法运算中,要至少保证有一个为string对象。例如:
chara[]={‘a’,’\0’};
charb[]={‘b’,’\0’};
stringc=“abdc”;
stringd=“abcd”+a;//错误,,赋值运算右侧没有string对象
stringe=a+b;//错误,赋值运算右侧没有string对象
stringf=c+a;//正确
string对象可以用以空字符结尾的字符数组进行操作,但是反过来却不行。不能用string对象对字符指针进行任何操作。不过为了完成从string对象到字符指针的转变,string专门提供了一个c_str成员函数(顾名思义,就是返回c的字符串指针):
stringa=“helloworld!”;
char*str=s;//错误
constchar*str=s.c_str();//正确
但是,这样的写法无法保证c_str函数返回的数组一直有效,因为如果后续操作改变了s的值,那么之前返回的数组可能就变了。比如:
stringd="abc";
constchar*c=d.c_str();
cout<<c<<endl;
d="efg";
cout<<c<<endl;
则输出的结果为:
abc
efg
可以看出string对象变化了,即使我们没有将变化后的值重新赋值给c,但是其结果仍旧跟着变了。所以如果我们想保存当前的字符串,那么最好将结果重新拷贝一份。
也有伤心的,既有令人兴奋的,也有令人灰心的,