先来看看一段程序
#include<iostream.h>
using std::cin;
using std::cout;
using std::endl;
int main()
{
cout<<"Enter two numbers:"<<endl;
int v1,v2;
cin>>v1;
cin>>v2;
cout<<"The sum of "<<v1
<<" and "<<v2
<<" is "<<v1+v2<<endl;
return 0;
}
跟以往的程序不同,在头文件下面加了using声明,因为我用的是创天中文VC++(家里的2500+、NF2主板、512内存不太适合按照vs2005,而且是vs2005我不会用.....)
在创天中文VC++里面不定义using声明也可以直接用cout而不用在前面加上std::字样,这点不太明白,为什么两者编程环境却有如此区别.
C++ Primer 4th是这么说的,对cin,cout和endl进行using声明,就意味着以后可以省去前缀std::,直接使用命名空间中的名字,这样代码可以更易读.
3.1命名空间的using声明
在之前的程序,都是通过直接说明名字来自std命名空间,来引用标准库中的名字.例如,需要从标准输入读入数据时,就用std::cin.这些名字都用了::操作符,该操作符是作用域操作符.它的含义是右操作数的名字可以在左操作数的作用域中找到.因此,std::cin的意思是说所需名字cin是在命名空间std中定义的,显然,通过这种符号引用标准库名字的方式是非常麻烦的(这里估计编译环境是VS2005,而不是我所用的创天VC++,)
C++提供了更简洁的方式来命名空间成员.这是一种最安全的机制:using声明.
使用using声明可以在不需要加前缀namespace_name::的情况下访问命名空间中的名字.using声明的形式如下:
using namespace::name;
一旦使用了using声明,我们就可以直接引用名字,而不需要再引用该名字的命名空间:
#include<string.h>
#include<iostream.h>
using std::cin;
using std::string;
int main()
{
string s; //ok:string is now a synonym for std::string
cin>>s; //ok:cin is now a synonym for std::cin
cout<<s; //error:no using declaration;we must use full name
std::cout<<s; //ok: explicitly use cout from namespace std
}
没有using声明,而直接使用命名空间中名字的未限定版本是错误的,尽管有些编译器也许无法检测出这种错误(创天中文VC++就是其中一种 -.-)
1.每个名字都需要一个using声明.
一个using声明一次只能作用于一个命名空间成员.using声明可用来明确制定在程序中用得到的命名空间中的名字,如果希望使用std(或其他的命名空间)中的几个名字,则必须为要用到的每个名字都提供一个using声明.如文章开头的程序.对cin,cout和endl进行using声明,就意味着以后可以省去前缀std::
2.使用标准库类型的类定义
有一种情况下,必须总是使用完全限定的标准库名字:在头文件中.
理由是头文件的内容会被与处理器复制到程序中.用#include包含文件时,相当于头文件中的文本将成为我们编写文件的一部分.如果在头文件中放置using声明,就相当于在包含该头文件的每个程序中都会放置了同一using声明,不论该程序是否需要using声明.
实践告诉你:通常,头文件中应该只定义确实必要的东西.请养成这个好习惯.