所谓 C 风格的字符串即 以空字符结束的字符数组

下面定义了一个 string 对象:

1
string s("Hello World");

允许使用字符串字面值来初始化 string 对象,更一般的情况下,能够出现字符串字面值的地方都能出现以空字符结束的字符数组:

  • 允许以空字符结束的字符数组来初始化 string 对象或者为 string 对象赋值
  • 在 string 对象的加法运算中,允许其中一个 (仅仅是一个) 运算对象用以空字符结束的字符数组来替代,在 string 对象的复合赋值运算中,允许其 右侧运算对象 用以空字符结束的字符数组来替代

上述性质反过来是不成立的,即不允许用 string 对象来初始化一个以空字符结束的字符数组,在以空字符结束的字符数组作为运算对象时不允许用 string 对象来替代,例如:不能使用 string 对象直接初始化一个指向字符的指针,使用 string 对象的 c_str 函数来完成这个功能,c_str 函数的返回结果是一个指向以空字符结束的字符数组的指针,这个字符数组的内容与调用这个函数的 string 对象的内容完全一致:

1
2
char *str = s; // 错误:不能使用 string 对象初始化 char*
const char *str = s.c_str(); // 正确

为了更加清晰地理解 c_str() 函数的返回结果,看看以下的程序及其运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;

int main()
{
string s("Hello World"); // 用字符串字面值初始化一个 string 对象
// 调用 c_str 函数返回一个指向以空字符结束的字符数组的指针
const char *str = s.c_str();

for (decltype(s.size()) i = 0; // 输出这个字符数组的内容以验证结果
i < s.size(); ++i)
cout << *str++; // 解引用指针,得到指针所指元素的值后,移动指针
cout << endl;

return 0;
}

以上程序的运行结果为:Hello World