c++ - 为什么 std::string 对象在使用默认构造函数构造时表现不同?

标签 c++ stl insert stdstring c++-standard-library

我尝试了以下程序:

#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/

相关文章:

c++ - 如何制作单例类 BlackBerry 10

c++ - boost::interprocess : shared memory and STL types

php - 检查数据并将其插入MySQL数据库 Node 的有效方法

arrays - 在 Perl DBI 中使用数组插入 1 行和很多列

java - 安卓插入语句

c++ - 超出窗口的 opengl 菜单是如何实现的?

c++ - 0xDEADBEEF 与 NULL

java - 需要帮助 java 到 C++ ssl 套接字

c++ - 如何在一个表达式中创建一个初始化 vector ?

c++ - 为什么使用自定义 wcscmp 和 wmemcmp 比较器对 vector<wstring> 进行排序比默认速度快得多?