名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字“namespace”,使用名字空间时用符号“::”指定。
#include
<iostream>using namespace
std;namespace
na {void
print(int
n) { //与名字空间nb的函数名相同 cout << "na::print: " << n << endl; } }namespace
nb {void
print(int
n) { //与名字空间na的函数名相同 cout << "nb::print: " << n << endl; } }namespace
na //同一个名字空间可以定义多次 {void
print2(int
a,int
b) { print(a); print(b); } }int
main ( ) { na::print(3); 指定na下的print函数 nb::print(4); 指定na下的print函数 na::print2(5, 6); 指定na下的print2函数return
0; }
使用“using namespace”可以使得后面不需要每次指定名字空间,相当于java中的import功能。不过,多次使用“using namespace”时,被指定的名字空间同时有效,很容易冲突。
#include
<iostream>using namespace
std;namespace
na {void
print(int
a) { cout << "na::print: " << a << endl; } }namespace
nb {using namespace
na;void
print2(int
a,int
b) { //这是nb自身的函数 print(a); //na的函数 print(b); //na的函数 }void
print(int
n) { //这也是nb自身的函数 cout << "nb::print: " << n << endl; } }namespace
nc {using
nb::print2; //指定只使用nb的print2()函数void
print(int
a,int
b,int
c) { print2(a, b); //这是nb的函数 nb::print(c); //using中没有指定,所以这儿必须用nb::来指定 } }int
main ( ) {using namespace
na; print(2); //na的print()函数 //using namespace nb; //这样使用时,na和nb同时有效 //print(3); //编译系统不清楚究竟调用na和nb中的哪一个,因为函数名和参数相同using namespace
nc; //这样使用时,na和nc同时有效 print(4, 5, 6); //nc的print()函数的参数与na中的参数不同,所以这儿不出错。using
nb::print; //指定下面用的print()函数是nb的函数 print(7);return
0; }
名字空间可以一层层嵌套,指定时也得一层层地指定,这样很不方便,一般用别名代替就方便多了。
#include
<iostream>using namespace
std;namespace
na {namespace
nb {namespace
nc {int
sum(int
a,int
b) {return
a + b; } } } }namespace
A = na::nb::nc;int
main ( ) { cout << na::nb::nc::sum(5, 11) << endl; cout << A::sum(6, 12) << endl;return
0; }
名字空间的名字也可以省略,称之为“无名名字空间”,无名名字空间经常被使用,其作用是“内部可以引用,而外部不能引用”。
#include
<iostream>using namespace
std;namespace
na {namespace
{ //无名名字空间int
sum(int
a,int
b) {return
a + b; } }int
calc(int
x,int
y) {return
sum(x, y); //内部可以调用无名名字空间的变量或函数 } }int
main ( ) { //cout << na::sum(5, 11) << endl; //因为缺少里面的名字,所以外部不能调用 cout << na::calc(6, 12) << endl;return
0; }