首先理解一下两者定义
iostream是C++标准库的头定义,对应的基本上是C++的输入输出相关库定义。类似于stdio 是C标准库里面的函数库,对应的基本都是标准输入输出等等C语言常用库的定义。开发C程序用Stdio,C++用Stdio/iostream 都可以。
using namespace(命名空间) std 顾名思义就是使用命名空间std,
什么是命名空间呢?就好比是多重空间,他们之间是互相独立的个体,不同空间里的定义和命名互不影响。
为什么需要要命名空间呢?在没有引入名字空间的概念之前,用户在一个cpp文件(即用C或C++代码写的源码文件)的开始位置一般会引入头文件,比如<stdio.h>或者<iostream>,这里面就包含有已经定义好的全局变量、函数名、和类名,如果这些全局变量、函数名、和类名数目不多,那程序员在写自己的程序时引入的新名称还不容易重复。但是如果很不幸引入了多个头文件,那么这些头文件里的全局变量、函数名、和类名非常多,程序员在写自己的代码段时就很容易造成名字重复了。若我们同时把C的标准库<stdio.h>、<ctype.h>、<stdlib.h>、<string.h>、<assert.h>、<limits.h>、<stddef.h>、<time.h>、<float.h>、<math.h>、<error.h>、<locale.h>、<setjmp.h>、<signal.h>、<stdarg.h>引入到头文件中,那名字重复的概率就很大了。这时编译器该匹配哪个呢?只好取决于哪个库文件先被引用到文件中,并且把另外一个完全屏蔽掉。这显然不是一个好的方法。在标准库的产生过程中,这个问题被提了出来。为了解决上面这个问题,C++引入了名字空间(namesapce)的概念,对于C++的标准库而言,其对应的名字空间为std,标准库的组件都在名空间std中定义,由用户手动引入到程序中。
那么名字空间为啥能解决名字重复的问题呢?以下例子
//定义命名空间A
namespace A
{
int a=0;//在命名空间A中定义变量a
}
//1、定义命名空间B
namespace B
{
int a=0;//在命名空间B中定义变量a
}
int main()
{
//使用命名空间的基本方法1
using namespace B;//告诉编译器我要使用命名空间B中的功能了
a=10; //将命名空间B中的变量“a”由0更改为10,命名空间A的a不会改变
cout<<a<<endl;
}
C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h,即出现了现在的<iostream>头文件。当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用C++所规定的标准的命名空间(即:namespace std),这样才能正确使用cout、endl等功能。