std::string 在内部以空终止 C 字符串的形式存储其数据,但在正常使用中不允许您访问空终止符。
例如,如果我分配值“Hello, World!”到一个字符串,内部缓冲区将如下所示:
std::string myString("Hello, World!");
// Internal Buffer...
// [ H | e | l | l | o | , | | W | o | r | d | ! | \0 ]
// ^ Null terminator.
在此示例中,空终止符不是从字符串文字的末尾复制的,而是由std::string 在内部添加的。
正如@songyuanyao 在他的回答中提到的那样,结果是myString[myString.size()]; 返回'\0'。
那么为什么std::string 会在字符串的末尾分配一个空终止符呢?它当然不必支持一个,因为您可以将'\0' 添加到字符串中,并且它包含在字符串中:
std::string myString;
myString.size(); // 0
myString.push_back('\0');
myString.size(); // 1
这种行为的原因是为了支持std::string::c_str() 函数。 c_str() 函数需要返回一个以 null 结尾的 const char *。最有效的方法是简单地返回一个指向内部缓冲区的指针,但为了做到这一点,内部缓冲区必须在字符串末尾包含一个空终止符。从 C++11 开始,要求字符串包含空终止符来支持这一点。
附:虽然严格来说不是您问题的一部分,但应该指出,如果您的字符串包含空字符,您的问题的循环可能不会返回完整的字符串:
std::string S("Hey");
S.push_back('\0');
S.append("Jude");
for(int i = 0; S[i] != '\0'; ++i)
std::cout << S[i];
// Only "Hey" is printed!