为什么cout需要头字符串
Why header string is required for cout?
为什么在下面的代码中不包括"string"头,我可以声明字符串变量。但是,当我尝试打印字符串时,编译器只会报错cout。
"字符串"头包含哪些信息?
#include <iostream>
//#include "string"
int main ()
{
std::string str="SomeWorld";
std::cout<<str<<std::endl;
return 0;
}
因为定义std::basic_string
的头很可能(间接)被<iostream>
包含(std::string
是基于std::basic_string<char>
的类型定义)。operator<<
对std::cout
的重载只在<string>
中定义。
std::cout
不需要,std::string
需要
严格来说,除非您在所有中包含正确的标题,否则任何事情都可能发生。没有强制要求将一个标准头文件包含到其他标准头文件中。因此,为了便于移植和正确,您必须这样写:
#include <string> // for `std::string`
#include <ostream> // for `std::ostream &` in `operator<<`
#include <iostream> // for std::cout
int main() {
std::string str = "hello world";
std::cout << str << std::endl;
}
在任何实际实现中,你几乎总是可以省略一些头(例如ostream
可能已经包含在iostream
中),但以上是符合标准的方式。
<string>
头文件包含string
类的定义(注意:#include "string"
意味着在当前目录中包含string
文件,因此您应该使用尖括号代替"
来表示系统包含)
然而,iostream
已经包含了string
,(例如,声明operator<<
适用于std::string
)所以这就是为什么在这种情况下你不需要包含它的原因。
在任何情况下,包含你只需要的头是一个很好的做法。这使您的代码更具可移植性,并且在将该代码复制到另一个上下文中(例如,不包含iostream
作为先前包含的上下文中)时更显式。此外,请注意,它从未指定,例如,包括iostream
将使std::string
可用,所以严格地说,您必须包括string
才能使用std::string
。
因为<string>
包含在<iostream>
中。
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么我的 cout 在输出中没有显示字符串?
- 使用 cout 运算符重载字符串
- C++ - 如何从上到下制作 4x4 矩阵和 cout 列(需要解密字符串)
- C++ 不能在cout中使用向量和字符串文字
- 使用字符串流加速 std::cout 日志记录
- C++ cout 不接受字符串或带 + 的字符串
- cout 切断 for 循环中的字符串开头
- 使用带有 std::cout 的单引号打印字符串实际上打印了数字
- 为什么cout输出内存地址不是字符串?
- Cout 一个字符串可以打印任何内容到屏幕上
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- 使用易失性 c 字符串和 std::cout
- c++ 如何在 cout 之前洗牌/混合字符串
- 当给定一个字符串时,Cout 在行首开始打印
- cout 不能一致地打印字符串和变量值,导致输出未对齐
- "我该如何展示cout<<"发烧";因为我不熟悉字符串数组,它也卡在选择部分?
- COUT和特定的字符串长度算术操作C 的问题
- C 字符串cout角色丢失
- C++字符串cout错误