我尝试了以下程序:
#include <iostream>
#include <string>
int main ()
{
std::string str;
str[0] = 'o';
str[1] = 'k';
std::cout << str.length();
std::cout << "as a whole :";
std::cout << str << std::endl;
std::cout << "character by character :";
std::cout << str[0] << str[1] << std::endl;
return 0;
}
我不明白为什么我不能使用对象变量打印整个字符串以及为什么长度返回为 0
因为显然我已经使用下标运算符添加了字符,因为这会返回 char 引用,所以我知道这是合法的。
此外,我没有遇到任何异常。所以就是这样。显然,std::string
类的幕后发生了很多事情,我知道我错过了一些东西。有人可以帮我解决这个问题吗?
最佳答案
您有一个长度为 0
的字符串,然后尝试使用下标运算符修改其内容。这是未定义的行为,因此目前无法保证特定的结果。如果您改用 at()
,它就会暴露错误并引发异常。
why the length is returning as 0
它开始时为 0
,并且您没有执行任何添加操作(例如 push_back
或 +=
)。但话又说回来,由于您之前所做的是未定义的行为,因此这里可能发生任何事情。
In addition, I didn't get any kind of exception.
您可以尝试std::string::at
相反,当您尝试这样做时,它将抛出 std::out_of_range
异常。
关于c++ - 为什么 std::string 对象在使用默认构造函数构造时表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58797024/