混合使用标准库类 string 和 C 风格字符串
许多 C++ 程序在有标准类之前就已经存在了,因此既没有使用标准库类型 string 也没有使用 vector。而且,许多 C++ 程序为了兼容现存的 C 程序,也不能使用 C++ 标准库。因此,现代的 C++ 程序经常必须兼容使用数组和/或 C 风格字符串的代码,标准库提供了兼容处理。
毫无疑问,当然可以用字符串字面值来初始化 string 类对象:
string st3("Hello World"); // st3 holds Hello World
通常,由于 C 风格字符串与字符串字面值具有相同的数据类型,而且都是以空字符 null 结束,因此可以把 C 风格字符串用在任何可以使用字符串字面值的地方:
1) 可以使用 C 风格字符串对 string 对象进行初始化或赋值。
2) string 类型的加法操作需要两个操作数,可以使用 C 风格字符串作为其中的一个操作数(或者用作复合赋值操作的右操作数)。
反之则不成立:在要求C风格字符串的地方不可直接使用标准库 string 类型对象。例如,无法使用 string 对象初始化字符指针:
char *str = st2; // compile-time type error
但是,string 类提供了一个名为 c_str 的成员函数,以实现我们的要求:
char *str = st2.c_str(); // almost ok, but not quite
c_str 函数返回 C 风格字符串,其字面意思是:“返回 C 风格字符串的表示方法”,即返回指向字符数组首地址的指针,该数组存放了与 string 对象相同的内容,并且以结束符 null 结束。
如果 c_str 返回的指针指向 const char 类型的数组,则上述初始化失败,这样做是为了避免修改该数组。因此,正确的初始化应为:
const char *str = st2.c_str(); // ok