C++ 名称空间

在C++中,名称可以是变量,函数,结构,枚举,类以及类和结构的成员。

声明区域:声明区域是可以在其中进行声明的区域。例如可以在函数外面声明全局变量,对于这种变量,其声明区域为其声明所在文件。对于在函数中声明的变量,其声明区域为其生命所在的代码块。

潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾,因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。

C++关于全局变量和局部变量的规则定义了一种名称空间层次。每个声明区域都可以声明名称,这些名称独立于在其他声明区域中声明的名称。

下面的代码使用关键字namespace创建了两个名称空间:jack 和 jill

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

任何名称空间中的名称都不会与其他名称空间中的名称发生冲突。因此jack 和 jill 中的fetch 可以共存,jill 中的hill 可以和外部的hill 共存。

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

扫描二维码关注公众号,回复: 2749561 查看本文章

未被装饰的名称(如pail)称为未限定的名称;包含名称空间的名称(如jack: :pail)称为限定的名称。

using 声明和using 编译指令

using声明使特定的标识符可是==可用,using编译指令使整个名称空间可用。

using声明由被限定的名称和它前面的关键字using组成:

using jill: :fetch;

using声明将特定的名称添加到它所属的声明区域中。例如main()中的using声明jill: :fetch添加到main()定义的声明区域中。完成该声明后,便可以使用名称fetch 代替 jill: :fefch。

由于using声明将名称添加到局部声明区域中,因此这个实例避免了将另一个局部变量也命名为fetch。另外,和其他局部变量一样,fetch也将覆盖同名的全局变量。

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

using namespace jack;

在全局声明区域中使用using编译指令,将使该名称空间的名称全局可用。

using编译指令 和 using声明的比较

使用using编译指令导入一个名称空间中的所有名称与使用多个using声明是不一样的,而更像是大量使用作用域解析符。

使用using声明时就好像声明了相应的名称一样。

如果某个名称已经在函数中声明了,则不能用using声明导入相同的名称。

使用using编译指令时将进行名称解析,就像在包含using声明和名称空间本身的最小声明区域中声明了名称一样。

如果使用using编译指令导入一个已经在函数中声明的名称,则局部名称将隐藏名称空间名,就像隐藏同名的全局变量一样。不过仍可以像下面的示例中那样使用作用域解析符:

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

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

可以给名称空间创建别名

例如:

namespace my_very_favorite_things {.......}

则可以使用下面的语句将mvft成为my_very_favorite_things的别名:

namespace mvft = my_very_favorite_things;

猜你喜欢

转载自blog.csdn.net/qq_42128241/article/details/81635822