namespcae说明
一次只引入命名空间的一个成员(using std::cout)
别的同名实体将被隐藏,可不用头部直接使用cout
namespace指示
一次引入整个命名空间(using namespace std)
即使是在函数内部使用也依旧好像在全局变量的位置一样,我理解的是这种描述的“效力”没有那么强(下面的例子可以说明)
示例
#include <iostream>
#include <string>
using std::cout;
using std::endl;
namespace blip{
int i=16, j=15, k=23;
//其他声明
}
int j = 0; //正确,blip的j隐藏在命名空间中
void f();
int main(){
using namespace blip;
//using blip::j;
cout<<i<<endl;
//cout<<j<<endl; //会在编译的时候出问题,必须注释掉
cout<<::j<<endl;
cout<<blip::j<<endl;
int k=9;
cout<<k<<endl;
f();
return 0;
}
void f(){
cout<<j<<endl;
}
输出:
16
0
15
9
0
可以看到,当我们用using指示一次引入整个命名空间的时候,我们有一处注释掉的代码。因为在这里引入变量 j会有命名冲突发生,从而引发编译错误,使用时依旧需要将名字空间加在 j前面,就好像这个是在全局中写的一样。当然,我们可以看到 f()中的 j依旧是0没有冲突,也就是对别的函数不造成影响,只对main()函数好像是写在全局。
#include <iostream>
#include <string>
using std::cout;
using std::endl;
namespace blip{
int i=16, j=15, k=23;
//其他声明
}
int j = 0; //正确,blip的j隐藏在命名空间中
void f();
int main(){
//using namespace blip;
using blip::j;
cout<<i<<endl;
cout<<j<<endl;
cout<<::j<<endl;
cout<<blip::j<<endl;
int k=9;
cout<<k<<endl;
f();
return 0;
}
void f(){
cout<<j<<endl;
}
输出:
16
0
15
9
0
而在这种情况下,用using声明就能够屏蔽外部的全局变量,做到直接使用blip中定义的 j,同时 f()中的全局变量 j依旧没有影响。
总结
总的来说就是using指示引入的名字“效力”没有那么强,这点我估计是考虑到很多处使用using指示的时候由于引入的名称太多,编译器会不方便判断而统一处理的一种策略。所以在这里也告诉我们在大型项目中要尽量谨慎的使用using指示,预防错误的出现。