**什么是命名空间?**
命名空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字:
namespace name1
{
int a = 0;
}
说到这里,相信你一定会想到std这个命名空间。
没错,标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。
**命名空间的几种玩法...**
NO.1 两种访问方式
要在采用标准C++的平台上使用标准C++库中的组件,有两种方式:
1.写一个using指示符:using namespace std; 直接使用标准C++库中的所有成员。
2.用std::成员 的方式使用C++库里的成员。(::是作用域解析符)
在这里,我们只需要了解有这两种方式即可。为了程序的简洁性和可读性,编写程序时普遍采用第一种方式。当然,在同一段程序中,这两种方式可以同时使用。
NO.2 解决变量命名冲突的问题
我们来看这样一个例子:
#include<iostream>
using namespace std;
namespace name1
{
int value = 1;//name1域内对象
}
namespace name2
{
int value = 2;//name2域内对象
}
int value = 3;//全局变量
int main()
{
int value = 4;//局部变量
cout << name1::value << endl;
cout << name2::value << endl;
cout << value << endl;
getchar();
return 0;
}
在这段程序中,有两个域的域内变量和全局、局部变量。程序执行结果为:
由上图可以看出:
1.加上域作用限定符可以访问不同域中的成员变量,且变量名可以相同。
2.重名的全局和局部变量,编译器优先访问局部变量,为了印证这一点,在屏蔽掉局部变量后,程序执行结果如下:
另外,如果不想用::限定符来访问自己定义的命名空间,也可以在main函数前使用“using namespace +命名空间名”的方式来访问。
NO.3 命名空间的嵌套定义
除了单独使用外,命名空间还可以进行嵌套定义,例如:
#include<iostream>
using namespace std;
namespace name1
{
namespace name2
{
int value = 1;
}
int value = 2;
}
int main()
{
cout << name1::value << endl;
cout << name1::name2::value << endl;
getchar();
return 0;
}
程序执行结果大家已经猜到了,没错,就是2和1。
** 一点题外话。。。**
这个程序:
#include<iostream.h>
using namespace std;
int main()
{
cout << "Hello World" << endl;
getchar();
return 0
}
不会编译通过,是因为#include<iostream.h>是C++比较老的库, 而vc6.0仍然支持这个头文件 ,但新的编译器(如vs2008及以上)都不再支持,所以建议使用新库的头文件#include<iostream>。