名称空间学习总结

来源:互联网 发布:随机抽取算法 编辑:程序博客网 时间:2024/05/17 01:49

名称空间学习总结(转载)

分类: C++ 288人阅读 评论(0)收藏 举报

1、using namespace

名称空间主要是为了解决在大的互相合作的工程中,出现像变量、函数、结构、枚举、类以及类和结构的成员的名称相互冲突的可能。

Declaration region:声明区域,是可以在其中进行声明的区域。

Potential scope:潜在作用域,变量的潜在作用域是从声明点开始,到其声明区域结束。由于变量必须在声明之后在能使用,因此潜在作用域比声明区域小。

注意:注意变量并非在其潜在作用域中任何位置都是可见的。如,它可能被在嵌套声明区域中声明的同名变量隐藏。

using 声明和using编译指令:

using声明是将特定的名称添加到它所属的声明区域中。它像其他的变量一样,能够覆盖同名的变量。

using编译指令是使所有的名称都可以用。它是由名称空间名和关键字using namespace组成,使名称空间中的所有名称都可用,而不需要使用作用域解析操作符。using编译指令将名称空间的名称视为函数之外声明的,但它不会使得该文件中的其他函数能够使用这些名称。一般来说,使用using声明比使用using编译指令更安全。

[cpp] view plaincopyprint?
  1. #include <iostream>     
  2. using namespace std;    
  3. namespace Leezhm    
  4. {    
  5.       void Display()    
  6.       {    
  7.              cout<<"Hello,World!"<<endl;    
  8.       }    
  9. }    
  10.      
  11. namespace NewLeezhm    
  12. {    
  13.       void Display()    
  14.       {    
  15.              cout<<"Welcome!"<<endl;    
  16.       }    
  17.      
  18.       namespace NestedLeezhm    
  19.       {    
  20.              void Display()    
  21.              {    
  22.                     cout<<"Happy New Year!"<<endl;    
  23.              }    
  24.       }    
  25. }    
  26.      
  27. void Display()    
  28. {    
  29.       cout<<"Are you OK?"<<endl;    
  30. }    
  31.      
  32. namespace Jill    
  33. {    
  34.       double bucket(double n){ return n;};    
  35.       double fetch;    
  36.       struct Hill{int m; int n;};    
  37. }    
  38.      
  39. char fetch;    
  40.      
  41. int main()    
  42. {    
  43.       // 名称空间可以是全局,也可以位于另一个名称空间    
  44.       // 但不能位于代码块中     
  45.       //namespace AnotherLeezhm    
  46.       //{     
  47.       //    void Display()     
  48.       //    {     
  49.       //           cout<<"Is be OK?"<<endl;    
  50.       //    }     
  51.       //}     
  52.      
  53.       Leezhm::Display();    
  54.       NewLeezhm::Display();    
  55.       Display();    
  56.      
  57.       //using namespace NewLeezhm;    
  58.       //NestedLeezhm::Display();     
  59.       //::Display();     
  60.      
  61.       using namespace NewLeezhm::NestedLeezhm;    
  62.       ::Display();    
  63.      
  64.       using NewLeezhm::NestedLeezhm::Display;    
  65.       Display();    
  66.      
  67.       using namespace Jill;    
  68.       //Hill Thrill;     
  69.       double water = bucket(2);    
  70.       double fetch;    
  71.       cin>>fetch;   //local variable;hides the Jill::fetch    
  72.       cin>>::fetch; //global variable     
  73.       cin>>Jill::fetch;//Jill:fetch    
  74.       cout<<fetch<<" "<<::fetch<<" "<<Jill::fetch<<endl;    
  75.      
  76.       return 0;    
  77. }    
  78.      
  79. int foom()    
  80. {    
  81.       // 虽然在main()中使用using namespace编译指令将Jill名称空间    
  82.       // 的名称视为在函数之外声明的,但它保证不会使得该文件中的其他     
  83.       // 函数能够使用这些名称,在下面就不能使用Hill    
  84.      
  85.       Hill top;// error, undeclared identifier;    
  86.       Jill::Hill crest;//warning , unreferenced identifier    
  87.      
  88.       return 0;    
  89. }    

我们在编程中要尽可能地参考一下一些原则:

1、使用在已命名的名称空间中声明的变量,而不使用外部全局变量和静态全局变量。

2、尽量将自己开发的一组有逻辑关系的类库和函数库,放人一个名称空间中。

3、仅将using编译指令作为将旧代码转换为使用名称空间的权宜之计。

4、不要在头文件中使用using编译指令。如果一定要使用,请放在#include之后。

5、在导入名称时,优先使用using声明的方法。

6、对于using声明,首选将其作用域设置为局部而不是全局。

原创粉丝点击