您的位置:首页 > 编程语言 > C语言/C++

c++primer plus 第九章-名称空间

2015-09-14 15:51 274 查看
c++primer plus 第九章-名称空间

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

除了用户定义的名称空间外,还存在另一个名称空间--全局名称空间。它对应于文件级声明区域,因此前面所说的全局变量现在被描述为位于全局名称空间中。

当然,需要有一种方法来访问给定名称空间中的名称。最简单的方法是,通过作用于解释运算符::,使用名称空间来限定该名称。

Jack::pail=12.34;

Jill::Hill mole;

未被装饰的名称称未限定的名称;包含名称空间的名称称为限定的名称。

using声明:由被限定的名称和它前面的关键字using组成;using声明将特定的名称添加到它所属的声明区域中。

using Jill::fetch;

using编译指令:由名称空间名和它前面的关键字using namespace组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符;

using namespace Jack;

在函数中使用using编译指令,将使其中的名称在该函数中可用。

using声明和using编译指令的区分:有关using编译指令和using声明,需要记住一点,它们增加了名称冲突的可能性。但如果有名称空间jack和jill,并在代码中使用作用域解析运算符,则不会存在二义性。

jack::pail=3;

jill::pail=10;

变量jack::pail和jill::pail是不用的标识符,表示不同的内存单元。然而,如果使用using声明,情况将会发生变化:

using jack::pail;

using jill::pail;

pail=4;

这样,编译器不允许同时使用上述两个using声明,因为这样导致二义性。

注意:如果某个名称已经在函数中声明了,则不能使用using声明导入相同的名称;如果使用using编译指令导入一个已经在函数中声明的名称,则局部名称将隐藏名称空间名,就像隐藏同名的全局变量一样。

使用using声明比使用using编译指令更安全,这是由于它只导入指定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译指令导入所有名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。

可以将名称空间声明进行嵌套;

可以在名称空间中使用using编译指令和using声明;

也可以给名称空间创建别名;

namespace mvft=my_very_favorite_things;

在名称空间中声明的函数的作用域为整个名称空间,因此定义和声明必须位于同一个名称空间中。

名称空间及其前途总结:

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

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

3)如果开发了一个函数库或类库,将其放在一个名称空间中。

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

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

6)导入名称时,首选使用作用域解析运算符或using声明的方法。

7)对于using声明,首选使用作用域设置为局部而不是全局。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: