您的位置:首页 > 其它

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 中的运算符重载函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: