问题描述
string p="a";
cout<<p[4];
这段代码没有给出任何错误。这是否意味着 C++ 中的字符串数据类型也不像数组一样有界?
解决方法
您的代码有未定义的行为。
std::string::operator[]
不执行任何边界检查。
std::string::at()
另一方面,当您访问超出边界的数据时,它会执行边界检查并抛出类型为 std::out_of_range
的异常。
这是否意味着 C++ 中的字符串“数据类型”也不受数组限制?
当然 std::string
是有界限的。您访问其内容的方式是不同之处在于是否执行绑定检查。
参见 std::string::at()
,它会在出错时抛出 std::out_of_range
。 operator []
不检查边界。
标准 containers 也是如此,它提供随机访问(std::array
、std::vector
、std::deque
、std::map
、std::unordered_map
) : 通常,在 C++ 中,您应该始终确保不会发生超出范围的访问。这样可以提高程序的性能。但在某些特定情况下,使用异常处理(通过 try
和 catch
)可能会有所帮助,但会牺牲一些性能。