命名空间
命名空间的理解
命名空间是cpp的一种语言特性,就像class类一样。命名空间是为了解决全局变量和函数名冲突的问题。命名空间就像是车牌,上海的车前面都带个沪,陕西的车前面都带个陕,至于后面的数字和字母,也可以相同,也可以不同,这样车辆违章了才能够分辨出来。
定义
命名空间的定义方式如下,namespace是关键字,NS1是名称。
namespace NS1
{
void func1(void)
{
}
}
本源文件中引用
在同文件中有三种引用方式,第一种方法是在函数前加上空间的名称和两个冒号引用空间内的函数,这种方式成本较低,但是只能一个个引用,假如空间内有多个函数就比较麻烦,第二种方法使用using namespace NS1;类似于声明函数,这样在main中就可以直接引用func1();和其他函数,但是成本较高,大多用这两种,第三种用的较少。
//命名空间定义
namespace NS1
{
void func1(void)
{
}
}
//三种引用方式
using namespace NS1; //第二种方法
using NS1::func1; //第三种方法
int main (void)
{
NS1::func1(); //第一种方法
func1();
return 0;
}
不同文件中引用
在不同CPP文件中引用时要在引用的文件中进行声明,方式是在在引用前加namespace NS2 {void func2(void);};
或者namespace NS2 {extern void func2(void);};
然后在使用跨文件空间内的函数。
匿名命名空间
匿名命名空间就是把命名空间的名字去掉,在同一文件中,可以直接引用,也可以用 ::+函数来使用。匿名命名空间的作用和c语言中的static类似,但是比static的范围更广,在c语言中为了实现函数只在本源文件中使用,通常在函数名前加static,在cpp则用匿名命名空间来解决这个问题,也就是说通过上面的不同文件中引用命名空间的方法对于匿名命名空间来说是不可用的。
嵌套命名空间
嵌套命名空间就是在一个命名空间内再写一个命名空间。需要注意的是在内层命名空间调用外层命名空间的函数时,外层命名空间相当于全局,内层相当于局部,假如内外层有两个相同名称的函数,那么内层在调用时会先调用局部的。
namespace NS2
{
void func2(void)
{
cout<<"NS2::func2"<<endl;
}
namespace NS3
{
void func2(void)
{
cout<<"NS2::NS3::func2"<<endl;
}
void func3(void)
{
func2(); //在内层调用外层的func2,并且内层还有一个func2
}
}
}
此时输出为"NS2::NS3::func2"
在命名空间外层调用内层时,则用正常的引用方法即可。即NS3::func2();