在C++中支持三种域:局部域、名字空间域和类域。
名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开
头给它起一个名字
花括号括起来的部分称声明块。声明块中可以包括:类变量(带有初始化)、函数(带有定义)等。最外层的名字空间域称为全局名字空间域
即文件域。
名字空间域的引入,主要是为了解决全局名字空间污染(global namespace pollution)问题,即防止程序中的全局实体名与其他程序中的全局实
体名,命名冲突。
//1.普通的命名空间
namespace cao
{
int g_max = 10;
int g_min=0;
int my_add(int a,int b){ return a+b;}
}
// 2.名字空间域可分层嵌套,同样有分层屏蔽作用
namespace Primer
{
double pi = 3. 1415926535898;
double my_add(double a,double b) { return a + b;}
namespace Matrix
char my_max(char a,char b) { return a>b? a:b;}
}
//3.同一个工程中允许存在多个相同名称的命名空间
//编译器最后会合成同一个命名空间中。
namespace cao
{
float pi = 3.14;
int my_sub(int a,int b);
g_min=a-b;
return g_min;
}
1.使用using将名字空间中成员引入(using声明)
使用using声明可只写一次限定修饰名。 using声明以关键字using开头,后面是被限定修饰的名字空间成员名:
using cao::pi;
using Primer::Matrix::my_max;
//名字空间类成员matrix的using声明
//以后在程序中使用matrix时,就可以直接使用成员名,而不必使用限定修饰名。
int main()
{
printf("%1f\n",Primer::pi);
printf("%f\n",pi); // cao::
my_max('a','b');
return 0;
}
2.使用using namespace名字空间名称引入(using编译指令)
使用using指示符可以一-次性地使名字空间中所有成员都可以直接被使用,比using声明方便。
using指示符;以关键字using开头,后面是关键字namespace,然后是名字空间名。
using namespace cao;
int main()
{
printf("%1f\n" ,Primer::pi) ;
printf("%f\n",pi);// cao::
my_add(12,23); // cao::
return 0;
}
使用using声明比使用using编译指令更安全,这是由于它只导入指定的名称。由于该名称与局部名称发生冲突,编译器将发出指示。
使用using编译指令导入所有名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不
会发出警告。
3.未命名的名称空间
可以通过省略名称空间的名称来创建未命名的名称空间
namespace //未命名
{
int ice;
int bandycoot;
}
不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。这提供了连接性为内部的静态变量的替代品
总结:
-
不要在头文件中使用using编译指令,这样会掩盖哪些名称可用,而且包含头文件的顺序可能影响程序的行为。如果非要使用using编译指
令,应放在#include之后
-
导入名称时,首选域名解析符或using声明的方法
-
对于using声明,将其作用域设置为局部而不是全局