为什么cout需要头字符串?

时间:2011-07-25 14:51:36

标签: c++ string

为什么在下面的代码中不包含“string”标题我可以声明字符串变量。 但是当我尝试打印字符串时,编译器只会抱怨cout。

“string”标题包含哪些信息?

  #include <iostream>
//#include "string"

int main () 
{
    std::string str="SomeWorld";

    std::cout<<str<<std::endl;

  return 0;
}

5 个答案:

答案 0 :(得分:12)

因为std::basic_string最有可能(间接)包含定义<iostream>的标头(std::string是基于std::basic_string<char>的typedef)。但operator<< std::cout的重载仅在<string>中定义。

答案 1 :(得分:2)

std::cout不需要它,std::string需要它。

答案 2 :(得分:2)

严格地说,除非你包含所有正确的标题,否则任何事情都可能发生。没有强制将一个标准标题包含在任何其他标准标题中。所以为了便携和正确,你必须这样说:

#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中),但以上是符合标准的方式。< / p>

答案 3 :(得分:0)

<string>标头包含string类的定义(注意:#include "string"表示将string文件包含在当前目录中,因此您应该使用尖括号对于系统包含而不是"。)

但是,iostream已包含string,(例如,声明适用于operator<<的{​​{1}})因此这就是您不需要包含的原因在这种情况下。

在任何情况下,最好包含您需要的标题。这使您的代码更具可移植性,并且在您将该代码复制到另一个上下文(例如,不包含std::string作为先前的包含)的情况下更加明确。另请注意,永远不会指定,例如,包括iostream会使iostream可用,因此严格来说,您必须包含std::string才能使用string。< / p>

答案 4 :(得分:-2)

因为<string>中包含<iostream>。这就是编译器没有抱怨的原因。