混用string对象和C风格字符串
我们都知道允许使用字符串字面值来初始化string对象:
string s("Hello World!");
C++规定,任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代:
- 允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值。
- 在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算带对象(不能两个对象都是);在string对象的复合赋值运算中允许是用以空字符结束的字符数组作为右侧的运算对象。
上述性质反过来并不成立:如果程序的某处需要一个C风格字符串,无法直接用string对象来替代它。
例如:不能使用string对象直接初始化指向字符的指针。为了实现这一功能,string专门提供了一个名为c_str的成员函数:
char *str = s; // 错误:不能用string对象初始化char*
const char *str = s.c_str; // 正确
函数返回结果使用一个指针,该指针指向一个以空字符结束的字符数组,而这个数组所存的数据恰好与哪个string对象的一样。结果指针的类型是const char*,从而确保我们不会改变字符数组的内容。
PS:由于我们无法保证c_str函数返回的数组一直有效,如果后续的操作改变了s的值就可能让之前返回的数组失去效用。因此,如果执行完c_str()函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。