为什么我需要 std 和字符串库才能在 C++ 中使用字符串

Why do i need both std and string library to use strings in c++

我知道 string 类型存在于 namespace std 中。我还知道需要包含 <string> 库才能使用 string 类型。我的问题是:为什么我需要两者(包括库和使用 std 命名空间)来定义字符串?为什么我不能通过包含库来使用它?更一般地说,namespace std 包含库中缺少的内容?

这样看:std::string是类型的全名,很像"M. Kostas"是你的全名。

#include <string> 给你 std::string。仅当您首先建立了正确的上下文时,您才可以将其称为 string,例如通过 using namespace stdusing std::string,或者如果您自己恰好是 namespace std { /* ... */ }.

中的库代码

再次考虑与姓氏的类比。如果我首先确定我在谈论 "Kostas" 家族 (= using namespace std),或者如果我之前用 "M." 说过,我只能用 "M." 来称呼你我实际上是指 "M. Kostas" (= using std::string) ,或者如果我自己是 "Kostas" 家族的成员 (= namespace std { /* ... */ }).

请注意,您应该(至少包括我在内的许多程序员认为)很少使用 using namespace stdusing std::string。到处都使用完整的名称通常会更好。在头文件的全局范围内,使用快捷方式甚至不再是样式问题,而是会导致真正的技术问题。

命名空间和 headers 是两个独立的概念,做着完全不同的事情:

  1. header <string> 声明了与字符串库相关的各种实体,如 class 模板 std::basic_string,一些 typedef 等 [=13] =] 和 std::wstring,以及一些函数。
  2. 命名空间用于对相关功能进行分组,并允许在不同的命名空间中使用相同的名称。例如,"vector" 本质上是一些数组(这是在命名空间 std 中定义此名称的标准 C++ 库采用的视图),而在其他上下文中它是一个数学实体。

当您包含 <string> 时,您获得了与在命名空间 std 内声明的字符串库相关的所有实体。有些人 object 赞成使用 std::string 的想法,因为使用 string 更容易。为了帮助这种做法,using 指令,即在查找名称时,可以使用像 using namespace std; 这样的语句在命名空间 std 中查找实体。也就是说,using 指令只是使名称可以无限制地使用。