C++ 命名空间

一、前言

在实际的工作中,我们不可能一人完成一个项目的开发工作,一般都是多人合作。多人合作实现项目的功能就可能会出现变量或者函数的命名冲突。为了解决这个问题,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、隐藏具体实现细节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值