随着项目增大,程序中名称相互冲突的可能性将增加。使用多个厂商的类库时,可能导致名称冲突。故提供名称空间工具来更好地控制名称的作用域。
用namespace声明名称空间:
namespace Jack {
int a;
double b;
void show();
}
namespace John {
int a;
double b;
void show();
}
名称空间可以是全局的,也可以是在另一名称空间中,但不能在代码块中。默认情况下,名称空间中的声明的名称时外部链接性的(所有文件通用),除非引用了const。通过作用域解析运算符::来使用名称空间来限定名称:
Jack::a = 2;
John::show();
我们不希望每次使用名称时都进行限定,故提供两种机制:using声明和using编译指令。
using声明:
using Jack::a;
如果将using声明放在局部声明区域,则将覆盖同名的全局变量。
using声明使一个名称可用,而using编译指令使得所有名称可用:
using namespace Jack;
在全局声明区域中使用using编译指令,则全局可用;在函数中使用using编译指令,则在该函数中可用。
一般来说,using声明比编译指令更安全。using编译指令导入所有名称,包括可能不需要的名称。如果此时与局部名称冲突,则局部名称将覆盖名称空间版本而不发出警告。而用using声明,发生这种情况编译器会指示。
总之,导入名称时首选::或using声明的方法;对于using声明,首选将其设置为局部而不是全局。
老式头文件iostream.h没有使用名称空间,新式iostream使用了std名称空间。
名称空间可以嵌套。
创建未命名的名称空间,相当于链接性为内部的静态变量的替代品。由于没有名字,在其它文件中无法用using。
新闻热点
疑难解答