C++ 60分钟入门教程 - 3、C++名字空间

来源:互联网 发布:菜单制作软件 编辑:程序博客网 时间:2024/05/29 18:58

名字空间的定义

名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字“namespace”,使用名字空间时用符号“::”指定。
  • 不指定名字空间的变量或函数都是当前名字空间下的变量或函数。
  • 不定义名字空间的情况下,都属于全局名字空间。
  • 同一个名字空间可以定义多次。

名字空间定义和使用举例:
  1. #include <iostream>
  2. using namespace std;
  3. namespace na
  4. {
  5. void print(int n) { //与名字空间nb的函数名相同
  6. cout << "na::print: " << n << endl;
  7. }
  8. }
  9. namespace nb
  10. {
  11. void print(int n) { //与名字空间na的函数名相同
  12. cout << "nb::print: " << n << endl;
  13. }
  14. }
  15. namespace na // 同一个名字空间可以定义多次
  16. {
  17. void print2(int a, int b) {
  18. print(a);
  19. print(b);
  20. }
  21. }
  22. int main ( )
  23. {
  24. na::print(3); // 指定na下的print函数
  25. nb::print(4); // 指定na下的print函数
  26. na::print2(5, 6); // 指定na下的print2函数
  27. return 0;
  28. }
运行结果:
na::print: 3
nb::print: 4
na::print: 5
na::print: 6

using的使用

使用“using namespace”可以使得后面不需要每次指定名字空间,相当于java中的import功能。不过,多次使用“using namespace”时,被指定的名字空间同时有效,很容易冲突。
  1. #include <iostream>
  2. using namespace std;
  3. namespace na
  4. {
  5. void print(int a) {
  6. cout << "na::print: " << a << endl;
  7. }
  8. }
  9. namespace nb
  10. {
  11. using namespace na;
  12. void print2(int a, int b) { //这是nb自身的函数
  13. print(a); //na的函数
  14. print(b); //na的函数
  15. }
  16. void print(int n) { //这也是nb自身的函数
  17. cout << "nb::print: " << n << endl;
  18. }
  19. }
  20. namespace nc
  21. {
  22. using nb::print2; //指定只使用nb的print2()函数
  23. void print(int a, int b, int c) {
  24. print2(a, b); //这是nb的函数
  25. nb::print(c); //using中没有指定,所以这儿必须用nb::来指定
  26. }
  27. }
  28. int main ( )
  29. {
  30. using namespace na;
  31. print(2); //na的print()函数
  32. //using namespace nb; //这样使用时,na和nb同时有效
  33. //print(3); //编译系统不清楚究竟调用na和nb中的哪一个,因为函数名和参数相同
  34. using namespace nc; //这样使用时,na和nc同时有效
  35. print(4, 5, 6); //nc的print()函数的参数与na中的参数不同,所以这儿不出错。
  36. using nb::print; //指定下面用的print()函数是nb的函数
  37. print(7);
  38. return 0;
  39. }
运行结果:
na::print: 2
na::print: 4
na::print: 5
nb::print: 6
nb::print: 7

用别名指定名字空间

名字空间可以一层层嵌套,指定时也得一层层地指定,这样很不方便,一般用别名代替就方便多了。
  1. #include <iostream>
  2. using namespace std;
  3. namespace na {
  4. namespace nb {
  5. namespace nc {
  6. int sum(int a, int b)
  7. {
  8. return a + b;
  9. }
  10. }
  11. }
  12. }
  13. namespace A = na::nb::nc;
  14. int main ( )
  15. {
  16. cout << na::nb::nc::sum(5, 11) << endl;
  17. cout << A::sum(6, 12) << endl;
  18. return 0;
  19. }
运行结果:
16
18

没有名字的名字空间

名字空间的名字也可以省略,称之为“无名名字空间”,无名名字空间经常被使用,其作用是“内部可以引用,而外部不能引用”。
  1. #include <iostream>
  2. using namespace std;
  3. namespace na {
  4. namespace { //无名名字空间
  5. int sum(int a, int b)
  6. {
  7. return a + b;
  8. }
  9. }
  10. int calc(int x, int y)
  11. {
  12. return sum(x, y); //内部可以调用无名名字空间的变量或函数
  13. }
  14. }
  15. int main ( )
  16. {
  17. //cout << na::sum(5, 11) << endl; //因为缺少里面的名字,所以外部不能调用
  18. cout << na::calc(6, 12) << endl;
  19. return 0;
  20. }
运行结果:
18
1 0