C++名称空间

       在C++中,名称可以是变量、函数、结构、枚举、类以及类和结构的成员等。关于一般名称的特点,右转博文:引入名称空间之前C++变量和函数的存储方案及特点

—————————————————————————————————————————————————————————

 

 

传统的名称空间属性

声明区域:

       声明区域是可以在其中进行声明的区域。例如,外部(全局)变量的声明区域为其声明所在的文件;自动变量的声明区域为其声明所在的代码块。

潜在作用域和作用域:

       作用域与潜在作用域并不相同。变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,因为变量必须定义后才能使用。然而,变量并非在其潜在作用域都是可见的,它可能被另一个在嵌套声明区域中声明的同名变量隐藏。变量对程序可见的范围被称为作用域。

新的名称空间特性

       C++通过定义一种新的声明区域来创建命名的名称空间,这样做的目的是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。声明一个名称空间的关键字是namespace。

       名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,在默认情况下,在名称空间中声明的名称的链接性为外部链接性(除非它引用了常量)。

       除了用户定义的名称空间外,还存在另一个名称空间——全局名称空间(global namespace)。它对应于文件级声明区域,因此前面说的全局变量现在被描述为位于全局名称空间中。名称空间中的声明和定义规则同全局声明和定义规则相同。

       名称空间是开放的,即可以把名称加入到已有的名称空间中。因此我们可以在一处名称空间中定义函数,在另一处使用该名称空间来提供该函数的代码。

名称空间中各种名称的使用

1.作用域解析运算符

       当我们想访问给定名称空间中的名称时,最简单的方法是通过作用域解析运算符::,使用名称空间来限定该名称。

2.using声明

       使用第一种方法访问同一个名称时每次都需要使用作用域解析运算符,这无疑效率低下,C++提供了using声明解决这一点。使用using声明的名称将被添加到它所属的声明区域中(与引入名称空间之前的各种名称的特性相同)。using声明的使用在语法上只需要在被限定的名称前加上using关键字即可。

3.using编译指令

       using声明使一个名称可用,using编译指令由名称空间名和它前面的关键字using namespace组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符。除此之外,using编译指令的特性与using声明相同。

4.using namespace std;

       使用using namespace std语句将把#include头文件中的各种名称放到名称空间std中。

 

using声明与using编译指令的比较:

       使用using声明时,就好像声明了相应的名称一样,如果某个名称已经在函数中声明了,则不能用using声明导入相同的名称。然而使用using编译指令时,将名称进行解析,就像在包含using声明和名称空间本身最小的声明区域中声明了名称一样。假设在函数中使用了using编译指令,此时如果声明了另一个同名名称,使用using编译指令声明的名称将会被隐藏,因为即使在代码块中使用using编译指令,其作用的名称也不会被看做是局部的。

       需要指出的是,虽然函数中的using编译指令将名称空间中的名称视为在函数之外声明的,但它不会使得该文件中的其他函数能够使用这些名称。

名称空间的其他特性

       名称空间可以嵌套声明。

       using编译指令是可以传递的,这意味着如果我们使用了名称空间的嵌套声明,我们可以直接使用using编译指令将内层的名称空间中的名称“激活”。

 

namespace A{namespace B; int a}
using namespace B;//等价于两条语句:using namespace A; using namespace B;

       可以通过省略名称空间的名称来创建未命名的名称空间。

 

       对于未命名的名称空间,其潜在作用域为:从声明点到该声明区域末尾。从这个方面看,它与全局变量相似,然而,由于这种名称空间没有名称,因此不能显式地使用using编译指令或using声明来使它在其他位置可用。具体地说,不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。这提供了链接性为内部链接性的静态变量的替代品。

总结

       名称空间是C++为以前各种名称添加的一个“容器”,使用名称空间不仅可以使名称冲突的可能性进一步降低,还便于程序员对各种名称进行管理,简化大型编程项目的管理工作。因此,为统一编程理念,《C++ Primer Plus》中指出了一些当前的指导原则:

·使用在已命名的名称空间中声明的变量,而不是使用外部全局变量。

·使用在已命名的名称空间中声明的变量,而不是使用静态全局变量。

·如果开发了一个函数库或类库,将其放在一个名称空间中。事实上,C++当前提倡将标准函数库放在名称空间std中,这种作坊扩展到了来自C语言中的函数。

·近将using编译指令作为一种将旧代码转换为使用名称空间的权宜之计。

·不要在头文件中使用using编译指令。首先,这样做掩盖了要让哪些名称可用;另外,包含头文件的顺序可能影响程序的行为。如果非要用using编译指令,应将其放在所有预处理编译指令#include之后。

·导入名称时,首选使用作用域解析运算符或using声明。

·对于using声明,首选将其作用域设置为局部而不是全局。

 

       个人觉得以上指导原则是针对大型编程项目而言的,对于只有一个文件的简单程序大可不必如此规范。

 

 

 

                                                                             本文部分内容整理自《C++ Primer Plus(中文版)第6版》第九章

 

 

 

 

 

 

 

 

 

 





 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值