c++的知识点:namespace名称空间

Namespace 名称空间


C语言里,通常只分成全局或局部的变量/函数.在大项目里,当不同开发人员写代码时,会有函数名相同和变量名相同引发的冲突.所以在C源码里,如果变量或函数只是在当前源文件里使用时,可加static修饰符.


C++语言里,可以把全局空间划分成多个子空间(名称空间).在子空间里可以定义类型,函数,声明变量等,而不用管其它子空间里有没有相同的类型,函数及变量名等.也就是每个开发人员使用一个名称空间装载自定义的类型,函数等,这样即可避免冲突的状况.

注意:不属于任何一个名称空间的变量或函数就是属于全局空间的.

访问空间里的成员:空间的名称::成员


[cpp]  view plain  copy
  1. 1  
  2.   
  3. 2 #include <stdio.h>  
  4.   
  5. 3  
  6.   
  7. namespace myspace {  
  8.   
  9. typedef unsigned intu32;  
  10.   
  11. int num = 88;  
  12.   
  13. void func()  
  14.   
  15. 8 {  
  16.   
  17. 9 printf("kkkk\n");  
  18.   
  19. 10 }  
  20.   
  21. 11 };  
  22.   
  23. 12  
  24.   
  25. 13 namespace kkspace {  
  26.   
  27. 14 typedef unsigned intu32;  
  28.   
  29. 15 int num = 99;  
  30.   
  31. 16 void func()  
  32.   
  33. 17 {  
  34.   
  35. 18 printf("nono\n");  
  36.   
  37. 19 }  
  38.   
  39. 20 };  
  40.   
  41. 21  
  42.   
  43. 22 int main(void)  
  44.   
  45. 23 {  
  46.   
  47. 24 myspace::num = 88;  
  48.   
  49. 25 kkspace::func();  
  50.   
  51. 26  
  52.   
  53. 27 myspace::u32 a = 88;  
  54.   
  55. 28 kkspace::u32 b = 11;  
  56.   
  57. 29 printf("%d,%d\n"sizeof(a), sizeof(b));  
  58.   
  59. 30  
  60.   
  61. 31 return 0;  
  62.   
  63. 32 }  



名称空间里可以再划分出子空间来.

[cpp]  view plain  copy
  1. 2 #include <stdio.h>  
  2.   
  3. 3  
  4.   
  5. namespace myspace {  
  6.   
  7. typedef unsigned intu32;  
  8.   
  9. int num = 88;  
  10.   
  11. void func()  
  12.   
  13. 8 {  
  14.   
  15. 9 printf("kkkk\n");  
  16.   
  17. 10 }  
  18.   
  19. 11  
  20.   
  21. 12 namespace myspace2 {  
  22.   
  23. 13 void func() {  
  24.   
  25. 14 printf("fffffff\n");  
  26.   
  27. 15 }  
  28.   
  29. 16 };  
  30.   
  31. 17 };  



使用myspace2里的func函数时: myspace::myspace2::func();



使用名称空间,就是相当于把指定空间里的成员变为全局来访问.

用法:using namespace空间名

注意:如在函数体外声明使用名称空间,则整个程序所有函数都可直接访问空间里的成员而不需指定空间名.

如在函数体内声明,则只有此函数可以直接访问空间里的成员.


[cpp]  view plain  copy
  1. 1  
  2.   
  3. 2 #include <stdio.h>  
  4.   
  5. 3  
  6.   
  7. namespace myspace {  
  8.   
  9. void func()  
  10.   
  11. 6 {  
  12.   
  13. 7 printf("kkkk\n");  
  14.   
  15. 8 }  
  16.   
  17. 9 };  
  18.   
  19. 10  
  20.   
  21. 11 using namespace myspace;  
  22.   
  23. 12 int main(void)  
  24.   
  25. 13 {  
  26.   
  27. 14 func();  
  28.   
  29. 15 return 0;  
  30.   
  31. 16 }  



使用名称空间时需要注意不能与全局的变量或函数冲突.如下面myspace空间里有func函数,全局空间也有func函数,调用时就无法区分具体是用哪个函数了,这样是编译不过的.

[cpp]  view plain  copy
  1. 1  
  2.   
  3. 2 #include <stdio.h>  
  4.   
  5. 3  
  6.   
  7. namespace myspace {  
  8.   
  9. void func()  
  10.   
  11. 6 {  
  12.   
  13. 7 printf("kkkk\n");  
  14.   
  15. 8 }  
  16.   
  17. 9 };  
  18.   
  19. 10  
  20.   
  21. 11 void func() {  
  22.   
  23. 12 printf("globalfunc\n");  
  24.   
  25. 13 }  
  26.   
  27. 14  
  28.   
  29. 15 using namespace myspace;  
  30.   
  31. 16 int main(void)  
  32.   
  33. 17 {  
  34.   
  35. 18 func();  
  36.   
  37. 19 return 0;  
  38.   
  39. 20 }  
  40.   
  41.   
  42. 编译时的错误输出:  
  43.   
  44. [root@localhost 01namespace]#g++ 02test.cpp  
  45.   
  46. 02test.cpp: In function ‘intmain()’:  
  47.   
  48. 02test.cpp:18:7: error: callof overloaded ‘func()’ is ambiguous  
  49.   
  50. func();  
  51.   
  52. ^  
  53.   
  54. 02test.cpp:18:7: note:candidates are:  
  55.   
  56. 02test.cpp:11:6: note: voidfunc()  
  57.   
  58. void func() {  
  59.   
  60. ^  
  61.   
  62. 02test.cpp:5:7: note: voidmyspace::func()  
  63.   
  64. void func()  





解决这问题也可以在调用时直接指定是哪个空间的函数

[cpp]  view plain  copy
  1. 1  
  2.   
  3. 2 #include <stdio.h>  
  4.   
  5. 3  
  6.   
  7. namespace myspace {  
  8.   
  9. void func()  
  10.   
  11. 6 {  
  12.   
  13. 7 printf("kkkk\n");  
  14.   
  15. 8 }  
  16.   
  17. 9 };  
  18.   
  19. 10  
  20.   
  21. 11 void func() {  
  22.   
  23. 12 printf("globalfunc\n");  
  24.   
  25. 13 }  
  26.   
  27. 14  
  28.   
  29. 15 using namespace myspace;  
  30.   
  31. 16 int main(void)  
  32.   
  33. 17 {  
  34.   
  35. 18 myspace::func();  
  36.   
  37. 19 ::func(); //全局函数func  
  38.   
  39. 20 return 0;  
  40.   
  41. 21 }  
  42.   
  43.   
  44.   
  45. 名称空间里函数体在空间外实现.  
  46.   
  47. 空间里先声明函数原型,再在其它地方实现函数体.  
  48.   
  49. 1  
  50.   
  51. 2 #include <stdio.h>  
  52.   
  53. 3  
  54.   
  55. namespace myspace {  
  56.   
  57. void func();  
  58.   
  59. 6 };  
  60.   
  61. 7  
  62.   
  63. int main(void)  
  64.   
  65. 9 {  
  66.   
  67. 10 using namespacemyspace;  
  68.   
  69. 11  
  70.   
  71. 12 func();  
  72.   
  73. 13 return 0;  
  74.   
  75. 14 }  
  76.   
  77. 15  
  78.   
  79. 16  
  80.   
  81. 17 void myspace::func()  
  82.   
  83. 18 {  
  84.   
  85. 19 printf("myspacefunc\n");  
  86.   
  87. 20 }  



c++里,已把标准输入,输出功能封装到名称空间std里了

std::cin表示输入流对象

std::cout表示输出流对象

std::cerr表示错误输出流对象

std::endl表示换行符


代码:

[cpp]  view plain  copy
  1. 1  
  2.   
  3. 2 #include <iostream>  
  4.   
  5. 3  
  6.   
  7. int main(void)  
  8.   
  9. 5 {  
  10.   
  11. using namespace std;  
  12.   
  13. int num;  
  14.   
  15. 8  
  16.   
  17. 9 cin >> num;  
  18.   
  19. 10 cout << num << endl;  
  20.   
  21. 11  返回 0;  
  22.   
  23. 12}  
  24.   
  25.   
  26. 注意:代码里的” >>” /” <<”不是移位,是表示数据的方向  
  27.   
  28.   
  29.   
  30. 在/usr/include/c++/4.8.2/iostream头文件里:  
  31.   
  32. 42  名称空间 std_GLIBCXX_VISIBILITY(默认)  
  33.   
  34. 43 {  
  35.   
  36. 44_GLIBCXX_BEGIN_NAMESPACE_VERSION  
  37.   
  38. ...。  
  39.   
  40. 60  外部 流氓; ///链接到标准输入  
  41.   
  42. 61  extern  ostream cout; ///链接到标准输出  
  43.   
  44. 62  extern  ostream cerr; ///链接到标准错误(无缓冲)  
  45.   
  46. 63  extern  ostream clog; ///链接到标准错误(缓冲)  
  47.   
  48. ...  
  49.   
  50. 76_GLIBCXX_END_NAMESPACE_VERSION  
  51.   
  52. 77}  //命名空间  

猜你喜欢

转载自blog.csdn.net/gz_sgkj/article/details/80392018
今日推荐