任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代:
- 允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值。
- 在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个运算对象都是);在string对象的复合赋值运算中允许使用以空字符结束的字符数组作为右侧的运算对象。
string s("hello");
上述性质反过来就不成立了:如果程序的某处需要一个C风格字符串,无法直接用string对象来代替它。例如,不能用string对象直接初始化指向字符的指针。为了完成该功能,string专门提供了一个名为c_str的成员函数, 但是无法保证c_str函数返回的数组一直有效,事实上,如果后续的操作改变了string对象的值(指针指向的对象没变,但对象内存中元素的内容发生了改变)就可能让之前返回的数组失去效用。所以,如果执行完c_str()函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。
string str = "hello";
const char *s = str.c_str();
char *m;
strcpy(m,s);