名称空间学习总结(转载)
1、using namespace
名称空间主要是为了解决在大的互相合作的工程中,出现像变量、函数、结构、枚举、类以及类和结构的成员的名称相互冲突的可能。
Declaration region:声明区域,是可以在其中进行声明的区域。
Potential scope:潜在作用域,变量的潜在作用域是从声明点开始,到其声明区域结束。由于变量必须在声明之后在能使用,因此潜在作用域比声明区域小。
注意:注意变量并非在其潜在作用域中任何位置都是可见的。如,它可能被在嵌套声明区域中声明的同名变量隐藏。
using 声明和using编译指令:
using声明是将特定的名称添加到它所属的声明区域中。它像其他的变量一样,能够覆盖同名的变量。
using编译指令是使所有的名称都可以用。它是由名称空间名和关键字using namespace组成,使名称空间中的所有名称都可用,而不需要使用作用域解析操作符。using编译指令将名称空间的名称视为函数之外声明的,但它不会使得该文件中的其他函数能够使用这些名称。一般来说,使用using声明比使用using编译指令更安全。
- #include <iostream>
- using namespace std;
- namespace Leezhm
- {
- void Display()
- {
- cout<<"Hello,World!"<<endl;
- }
- }
- namespace NewLeezhm
- {
- void Display()
- {
- cout<<"Welcome!"<<endl;
- }
- namespace NestedLeezhm
- {
- void Display()
- {
- cout<<"Happy New Year!"<<endl;
- }
- }
- }
- void Display()
- {
- cout<<"Are you OK?"<<endl;
- }
- namespace Jill
- {
- double bucket(double n){ return n;};
- double fetch;
- struct Hill{int m; int n;};
- }
- char fetch;
- int main()
- {
- // 名称空间可以是全局,也可以位于另一个名称空间
- // 但不能位于代码块中
- //namespace AnotherLeezhm
- //{
- // void Display()
- // {
- // cout<<"Is be OK?"<<endl;
- // }
- //}
- Leezhm::Display();
- NewLeezhm::Display();
- Display();
- //using namespace NewLeezhm;
- //NestedLeezhm::Display();
- //::Display();
- using namespace NewLeezhm::NestedLeezhm;
- ::Display();
- using NewLeezhm::NestedLeezhm::Display;
- Display();
- using namespace Jill;
- //Hill Thrill;
- double water = bucket(2);
- double fetch;
- cin>>fetch; //local variable;hides the Jill::fetch
- cin>>::fetch; //global variable
- cin>>Jill::fetch;//Jill:fetch
- cout<<fetch<<" "<<::fetch<<" "<<Jill::fetch<<endl;
- return 0;
- }
- int foom()
- {
- // 虽然在main()中使用using namespace编译指令将Jill名称空间
- // 的名称视为在函数之外声明的,但它保证不会使得该文件中的其他
- // 函数能够使用这些名称,在下面就不能使用Hill
- Hill top;// error, undeclared identifier;
- Jill::Hill crest;//warning , unreferenced identifier
- return 0;
- }
我们在编程中要尽可能地参考一下一些原则:
1、使用在已命名的名称空间中声明的变量,而不使用外部全局变量和静态全局变量。
2、尽量将自己开发的一组有逻辑关系的类库和函数库,放人一个名称空间中。
3、仅将using编译指令作为将旧代码转换为使用名称空间的权宜之计。
4、不要在头文件中使用using编译指令。如果一定要使用,请放在#include之后。
5、在导入名称时,优先使用using声明的方法。
6、对于using声明,首选将其作用域设置为局部而不是全局。