命名空间
什么是命名空间?
在日常的程序代码编写中,我们经常会给大量的函数以及变量取名字,取的名字多了,你总会发现,有些名字就是不能使用,因为它会和库的函数发生冲突,让编译器混乱,在库和你写的变量名或者函数名之间摇摆,从而使程序崩溃!而命名空间就是为了避免这一情况发生,为了方便程序员充分发挥自由而产生的一种逻辑分组机制,它可以将函数和变量封装在一个独立的作用域当中,与其他作用域分割开来, 不被打扰,避免发生名称冲突
命名空间的使用
1.命名空间的声明
namespace namespace_name{
//内容
}
namespcae 用来声明命名空间
namespcae_name 命名空间名,可以自己随便写
{ } 内容编写,除了不能运行以外,其中的内容和main()中的内容一样,写函数,定义变量,结构体........
2.命名空间的使用
命名空间的使用有三种方法,以下述代码为例
namespace huaci { void Func() { cout << "HELLO,C++!" << endl; } int rand = 50; }
第一种: 命名空间名::成员名
huaci::Func(); int i = huaci::rand;
第二种 : 在全局区域开放命名空间中的成员
using 命名空间名 ::成员名
using huaci::Func; int main() { //内容 }
第三种: 直接展开命名空间,开放命名空间作用域
using namespace 命名空间名
using namespace huaci; int main() { //内容 }
注:后续两种方法属于是成员突破类域,脱离了命名空间的作用域限制,仍会和库中的成员发生命名冲突,一般不建议使用;后续两种方法都是在全局域中使用的,不能在main函数中使用
3.命名空间的使用规范
命名空间可以在全局作用域中定义,可以在其他命名空间中定义,实现嵌套
但不允许在函数内定义
命名空间的定义可以分散在多个文件中(命名空间同名可以合并),但是不能跨文件分割命名空间
命名空间名一般小写,单词之间用下划线隔开
嵌套命名空间
前面我们说了,命名空间可以在内部定义命名空间,命名空间中又有一个命名空间,这就是嵌套命名空间,嵌套命名空间的使用会复杂一些,但对代码的分割有十分大的帮助,让代码更加容易维护和管理
1.嵌套命名空间的书写
namespace out_namespace
{
//内容
namespace inside_namespace
{
void Func()
{
cout<<"hello C++"<<endl;
}
//内容
}
}
自嵌套命名空间就是命名空间中又有命名空间,嵌套层数由程序员自己决定,想怎么套,就怎么套,但一般不超过三层
2.嵌套命名空间的常见使用
嵌套命名空间的使用会比单命名空间复杂一些,我们主要探讨的是,内层命名空间怎么使用外层命名空间成员,外成命名空间又怎么使用内层命名空间成员,以及怎么在外部怎么访问内层命名空间
第一种 情况:外部访问内层命名空间
外层空间名::内层空间名::成员名
int main() { out_namespace::inside_namespace::Func(); //其他 }
第二种 情况:外层命名空间访问内层命名空间
namespace out_namespace { namespace inside_namespace { void Inside_Func() { cout << "内层命名空间" << endl; } } void Out_Func() { cout << "外层命名空间" << endl; inside_namespace::Inside_Func(); } } int main() { out_namespace::Out_Func(); return 0; }
运行结果
注:外层命名空间访问内层命名空间只能在内部命名空间后面的代码段,不能在内部命名空 间之前的代码段访问
namespace out_namespace { void Out_Func() { cout << "外层命名空间" << endl; inside_namespace::Inside_Func(); } namespace inside_namespace { void Inside_Func() { cout << "内层命名空间" << endl; } } } int main() { out_namespace::Out_Func(); return 0; }
这样是不符合C++要求的,会发生报错
第三种 内层命名空间访问外层命名空间
namespace out_namespace { void Out_Func() { cout << "外层命名空间" << endl; } namespace inside_namespace { void Inside_Func() { cout << "内层命名空间" << endl; Out_Func(); } } } int main() { out_namespace::inside_namespace::Inside_Func(); return 0; }
运行结果
内层命名空间访问外层命名空间的成员可以直接访问
注:当内层命名空间的成员与外层命名空间的成员发生重名的时候,内层命名空间会优先使用内层命名空间,即找自己的,再找外面的。
命名空间的好处
命名空间初步带我们认识了封装,将自己的代码放入一个独立的空间,给我们带来了许多好处
- 代码具有层次感,管理与维护的效率大大提高
- 封装的初步,各个命名空间互不打扰
- 组织代码,让代码可读性增强
熟练使用命名空间,会让你的代码看起来舒服很多,对你的代码维护有大大的帮助,希望本篇文章对你的命名空间理解有一定的帮助 ———甘宝的小鱼肝