共计 1534 个字符,预计需要花费 4 分钟才能阅读完成。
一、前言
在理论的工作中,咱们不可能一人实现一个我的项目的开发工作,个别都是多人单干。多人单干实现我的项目的性能就可能会呈现变量或者函数的命名抵触。为了解决这个问题,C++ 引入了 命名空间 的概念。
应用命名空间的目标是对标识符的名称进行本地化,以防止命名抵触。在中大型项目中,变量、函数、类、接口等都是大量存在的,如果不应用命名空间,那么这些名称都存在于全局命名空间中,能够引发很多意外的谬误。同理,如果一个我的项目中应用了多个第三方库,这些库中存在同名的变量、函数等,也会引发抵触。引入命名空间后,C++ 库就被定义到 std 命名空间中了。
二、阐明
1、namespace 关键字
namespace 关键字使得咱们能够通过创立作用范畴来对全局命名空间进行分隔。实质上来讲,一个命名空间就定义了一个范畴。定义命名空间的根本模式如下:namespace 名称 {// 申明}
在命名空间中定义的变量、函数等都属于该命名空间。在命名空间中申明的标识符是能够被间接援用的,不须要任何的命名空间的修饰符,如域解析操作符 ::。
雷同的命名空间名称是能够被屡次申明的,是互相补充的关系。命名空间也能够进行嵌套,即可在一个命名空间外部申明另一个命名空间。
2、域解析操作符
命名空间中的变量等的作用范畴被局限在命名空间内,那么内部项应用应该怎么应用呢?这就须要域解析操作符了。
一般来讲,在命名空间之外想要拜访命名空间外部的成员须要在成员后面加上命名空间和域解析操作符::。
如果申明了类型的对象,那就没有必须在对该对象的任何成员应用域解析操作符:: 了。
3、using 关键字
这个关键字的作用次要是简化应用域解析操作符指定命名空间的变量等。命名空间简略还好,如果比较复杂,每个成员都应用域解析操作符指定命名空间是一件很麻烦的事。因而引入了 using 关键字。如下:
using namespace 命名空间名称; ①
using 命名空间名称:: 成员;②
①形式将指定命名空间中的所有成员都引入到以后范畴,也就是将其变成以后命名空间(默认是 全局命名空间)的一部分,应用的时候就不须要域解析操作符了。
②形式让指定的命名空间中的指定成员在以后范畴中变为可见
4、未命名的命名空间
简略的说,就是没有名称的命名空间。
namespace
{// 申明}
这种没有命名的命名空间只有在申明它的文件中才是可见的,即:只有在申明其的文件中,它的成员才是可见的,能被间接应用的。
5、std 命名空间
次要是 C ++ 库的定义,为了咱们在应用相干 C ++ 库变量、函数时简化。
在引入命名空间之前,代码是没有应用命名空间的,为了兼容这种状况,保留了一份原来的库和头文件,同时将原来的库和头文件赋值一份,在这个根底上批改一些内容,放入 std 命名空间中,就成了 C ++ 的规范库,这样性能类似的库就存在了 2 份,不影响原有的我的项目。
为了防止头文件重名,新版的 C ++ 库对头文件的命名 去掉了后缀.h,如 iostream,而原来 C 语言的头文件则在文件名前减少一个 ”c” 字母,如 cstdio。
对于不带.h 的头文件,所有的符号都位于命名空间 std 中,应用时须要申明命名空间 std;对于带.h 的头文件,没有应用任何命名空间,所有符号都位于全局作用域。然而因为大部分编译器在实现时并没有严格遵循 C ++ 规范,导致程序员在代码实现时使不应用 std,都能编译胜利。
倡议:
①代码实现时最好加上命名空间
②最好在函数外部应用命名空间,防止抵触
三、总结
1、命名空间将具备彼此关联的项归类在同一个命名空间,通过命名空间反馈性能,形成具备高内聚低耦合、模块性很强的命名空间。
2、避免命名抵触,仅对编译器有用,对代码可读性没什么作用
3、限度作用域在本文件,相似 static 的作用,没有命名的命名空间
4、暗藏具体实现细节