C++——命名空间

        1.命名空间的意义

        

目录

        1.命名空间的意义

        2.命名空间的定义

        2.1 域作用限定符

        2.2 命名空间可以嵌套

        2.3 在很多文件中允许同名命名空间,编译器会把它们合并到一起

        2.4 在C++标准库是放在std这个命名空间中的

3. 命名空间的使用

        3.1展开全部命名空间        

        3.2展开部分命名空间

         3.3指定访问命名空间

总结


在C/C++中,变量,函数,类会有很多定义在全局,可能会导致命名冲突的问题出现,使用命名空间的意义就是将它们隔绝开,避免命名冲突的问题,例如:

在C语言中以下代码没有问题

但如果包含头文件<stdlib.h>,就会出现报错

这是因为rand函数是在stdlib.h这个头文件中,包含了这个头文件编译器不知道要用库函数还是我们自己定义的全局变量,这时就会有命名冲突的问题,所以在C++中引入了命名空间这个概念,就专门来处理这种问题

        2.命名空间的定义

        命名空间使用namaspace关键字,后面跟上命名空间的名称,紧接着一对{}即可,在花括号中可以定义变量,类型,函数等

namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。C++中的域有局部域,全局域,命名空间域,类域,域影响的是编译器的查找规则,所以有了域隔离,命名冲突问题就解决了,除此之外,局部域和全局域会影响生命周期,命名空间域和类域不会影响生命周期。
在默认情况下,编译器的查找规则是从局部域开始查找,如果找不到再去全局域查找,而不会主动的去命名空间种查找

优先局部域

找不到就去全局域找

        2.1 域作用限定符

如果局部域和全局域都没有,虽然命名空间中定义了,但也是未声明的标识符,这是因为编译器默认不会到命名空间中去查找,如果想到命名空间中去查找,就要用一个操作符::,这个操作符叫域作用限定符,就是用来指定域的

像这样,我们告诉编译器要在hx这个域中去查找a,编译器就可以找到了,并输出正确的结果

如果在::左侧没有类的名称,则是全局域

  • 命名空间必须定义在全局,不能定义在某个域中

错误的使用方法

        2.2 命名空间可以嵌套

访问hx1中的a,就需要指定类域,在hx里的hx1中的a,连续的嵌套

        2.3 在很多文件中允许同名命名空间,编译器会把它们合并到一起

        2.4 在C++标准库是放在std这个命名空间中的

3. 命名空间的使用

        3.1展开全部命名空间        

之前我们说编译器查找的规则是局部域->全局域,并不会主动到命名空间中去查找,当我们使用using这个关键字时,可以展开命名空间,展开的意思就是暴露在全局,现在局部没有,但是在全局中却发现了两个a,就会出现重定义的报错,而C++的标准库被封装在std这个命名空间中,所以我们使用using namespace std就相当于把标准库展开,把所有的东西暴露在全局,就使得命名空间的出现没有意义了,所以在大型工程中不建议使用,平时练习,oj题可以展开

        3.2展开部分命名空间

这是展开部分,仅仅是展开hx这个命名空间域中的a,所以在主函数内可以访问得到,但是b,c依然被封装在命名空间中,访问不到

         3.3指定访问命名空间

这是我们之前提到过的用域作用限定符指定访问命名空间中的变量,指定是在hx这个命名空间中去查找

总结

        C++中引入命名空间是为了解决C语言命名冲突的问题,定义一个域来进行封装,命名空间就像一堵墙,起到隔离的效果,因为编译器默认不会去命名空间中去查找,所以如果想访问命名空间内的变量就要用域作用限定符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值