namespace 命名空间
2016-05-07 21:13
274 查看
1. 定义
命名空间的定义如下:namespace SpaceName { ... }
其中,空间内部可以定义和声明类、变量、函数,变量会被赋予初值。定义时不仅可以定义全局,可以定义在已有的命名空间中(嵌套定义)。命名空间可以不连续(除未命名的命名空间),一个命名空间的第一次使用为定义,后续的使用为打开。注意,一般不建议把头文件包含进命名空间,这样做意味着把头文件中所有的命名全部加入到该空间中,这样做有一定的危险性。
全局的命名空间
即在全局范围内定义命名空间,该命名空间可以在局部的函数体内部使用,也可以在类内部使用, 总之它可以在本文件中的任意地方使用。
命名空间的嵌套
命名空间可以使用嵌套,例如:
namespace mySpace { ... namespace myChildSpace{ int i; ... } }
调用时加上前缀
mySpace::myChildSpace::i。在C++11新标准中允许定义内联命名空间。
inline namespace myChildSpace
内联namespace在调用时可以省去前缀,可以用于版本控制系统,例如:
namespace mySpace { ... namespace first { string version("1.0.0"); ... } inline namespace second { string version("2.0.0"); } }
调用时,mySpace::version 就会动调用内联函数中的 version 变量。如果想调用 first 中的变量,需要加上前缀 first。
未命名的namespace
未命名的namespace的适用范围仅限于本文件中,它是每个文件独有的命名空间。C++中的常用未命名的namespace来代替 static。
2. 命名空间的使用
可以为命名空间去个别名。例如:namespace MyNames { int iVal1 = 100; int iVal2 = 200; namespace YourNames { int val = 300; } } namespace MyAlias = MyNames; namespace YourAlias = MyNames::YourNames;
using
using的声明using std::string;
using的指示
using namespace std;
3. 查找
查找分为:普通查找OL(Ordinary Name Lookup)和依赖于实参的名字查找ADL(argument-depentment lookup)OL:在当前的作用域中找到函数名相同的函数,并且匹配最合适的参数(重载的时候)
ADL:根据实参的类型,先去去实参的基类中查找,再去包含实参类型的命名空间。例如:
operator<<(std::cout, "123");
当本文件中没有可用的运算符重载函数的时候,编译器会自动的从std::cout的类中和命名空间中去找,最后找到了 cout::string 中的运算符重载函数。
相关文章推荐
- 简单的ADSL登录界面
- BZOJ2440: [中山市选2011]完全平方数dizh
- RMQ算法
- Java开发中的23种设计模式详解
- MD之材料设计库(一)
- 双栈排序之程序员面试经典
- Linux课程实践一:Linux基础实践(基础操作)
- 【hihocoder 1257 Snake Carpet】构造
- 【字符串/尺取法】HDU5672String【BestCoder Round #81 (div.2)】
- android 中math常用方法
- 头文件搜索路径
- hdu 畅通工程系列题目
- Android - Retrofit 基础使用
- Java 基础面试题
- MyEclipse配置Maven
- 在IE9中实现placeholder功能
- [置顶] Unity中集成ShareSDK(3.X)的功能-Android平台
- c++第五次上机实验
- ThreadPoolExecutor详解
- 实战 ASP.NET Web API