######################################有些书说有些头文件不在std里是什么意思?######################################那些书那样说会造成困惑,因为名字空间,就像函数、结构、类等等,是用代码来表达的一种语言机制。std(standard的缩写)是标准C++里必须存在的一个名字空间的名字。所有实现标准C++的编译器都必须确保这空间的存在。名字空间声明是这样表达的:namespace x { // 创建新名字}x是该名字空间的名字。头文件装代码,代码表达名字空间。所以应该说“有些头文件的内容不在std里”。具体的意思就是,在那些头文件里,没有任何代码是在“namespace std { }”的括号里的。######################################std里包含些什么?######################################std里包含标准C++库里的所有名字(类名、函数名、...)。######################################为什么不用std就不能使用cout?######################################不是不能使用,只是不能直接写cout,必需用空间名和名字空间限制符作为前缀,写成std::cout。用某个名字做名字空间声明的时候,若已有同名的名字空间存在,就是仅仅把括号里的名字加进去,否则先创建空间,后加入括号里的名字。加入名字空间后的名字都是对全局空间隐藏的,但该名字空间的名字却不隐藏(除非该空间在另一个名字空间里)。cout隐藏在std里,但std本身不隐藏,所以你“#includeiostream”了之后,不必做使用声明便可直接用std,通过它访问cout。若你做了使用声明,对该使用声明所处的作用域的隐藏便被抵消(作用域的开端到声明之间的那段除外),即不必使用空间名和名字空间限制符作为前缀。######################################头文件中声明的东西为什么在使用的时候需要先using namespace std;一下?######################################你已经知道做使用声明是要讨个方便而不是一种必要。我们作个总结性的复习吧。(A)这简单的程序里只有全局和局部空间,没有其它的名字空间:void main( ) { std::cout ""; // 错误:std不存在。 cout ""; // 错误:std不存在cout就不用提了。}(B)这个则多了一个叫std的名字空间。std这名字也可见了:#includeiostreamvoid main( ) { std::cout ""; // OK:可通过std骚扰cout。 cout ""; // 错误:cout仍然被包在std里面,不可见。}iostream头文件里有std的声明。在编译之前,预处理器会用iostream里的全部内容来代替“#includeiostream”这个预处理器指示符。效果是,这程序包含iostream里的所有代码。include是包含的意思。包含指示是在全局空间里,所以在指示之后的任何地方,std这个名字是可见、可访问的。(C)这个不包含声明std的代码却尝试打开std包, 落了个跟(A)一样狼狈的下场:using namespace std;void main( ) { std::cout ""; // 错误:std不存在。 cout ""; // 错误:std不存在cout就不用提了。}(D)这个声明了std(曝露了std)并把std打开, 让里面的名字(cin、cout、cerr、...)跟 std一样暴露。[相信你闭上眼都能写出这段代码了]