c++名称空间
- 名称空间术语
- 新的名称空间特性
- 名称空间的使用理念
- 名称空间术语
c++中的名称包括:变量、函数、结构、枚举、类以及类和结构的成员。
名称空间作用:当程序项目越来越大时,c++中的名称冲突可能性将会增加,名称空间的出现即为了解决c++中名称冲突问题。
声明区域:是可以在其中进行声明的区域。例如,全局变量其声明区域为其声明所在的文件,局部变量其声明区域为其声明所在的代码块。
潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须在定义后才能使用。但声明区域中的变量并非在潜在作用域的任何位置都是可见的,它可能被别一个在嵌套声明区域中声明的同名变量隐藏。
- 新的名称空间特性
名称空间作用:
c++新增了一种功能,即通过定义一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称相同名称发生冲突,同时允许程序的其他部分使用该名称声明的东西。
创建名称空间关键字namespace,语法格式如下:
namespace name { int value; void func(); }
- 名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。
- 名称空间中声明的名称的链接性为外部的,除非它引用了常量。
- 全局名称空间对应于文件级声明区域,全局变量位于全局名称空间中。
- 名称空间中的声明和定义规则同全局声明和定义规则相同。
- 名称空间是开放的,可以把名称加入到已有的名称空间中。语法格式如下:
namespace name { double value2; }
为名称空间中的函数原型提供定义的语法格式如下:如下:如下(可在 该文件后面或另一个文件中提供定义):
namespace name { void func() { .... } }
访问名称空间:未被装饰的名称称为未限定的名称;包含名称空间的名称称为限定的名称。
使用解析运算符访问名称:
name::value = 100;
使用using声明和using编译指令简化对名称空间的访问:
using name::value; using namespace name;
- using声明将特定的名称添加到它所属的声明区域后,便可以使用value代替name::value,以简化代码。
- 关键字using namespace使名称空间中的所有名称都可用,而不需要使用域解析运算符。
- 在全局声明区域中使用using编译指令,将使该名称空间的名称全局可用。
- 使用域解析运算符可避免名称二义性,using声明和using编译指令,可能导致名称二义性。
- 如果名称空间和声明区域定义了相同的名称,则不能用using声明导入名称空间,这样会导致名称冲突,编译器不允许这样做。但可以用using编译指令导入名称空间,此时只是局部名称隐藏了名称空间名,用域解析运算符就可以访问了。
using声明比using编译指令更安全,因为如果有名称与局部名称发生冲突,编译器会发出指示,而后者不会发出警告。
名称空间嵌套
namespace name1 { namespace name2 { int value2; } int value1; }
访问value2的方法:
using name1::name2::value2; value2 = 100; using namespace name1::name2; value2 = 100; using namespace name1; name2::value2 = 100;
- using编译指令是可以传递的,即嵌套的名称空间会一起被导入。
- 创建名称空间别名:namespace alias_name = name;可以用来简化对嵌套名称空间的使用。
- 未命名的名称空间:可以通过省略名称空间的名称来创建未命令的名称空间。就像后面跟着using编译指令一样,也就是说,在该名称空间中声明的名称的潜在作用域为:从声明点开始到该声明区域的末尾。不能在未命名名称空间所属文件之外使用名称空间中的名称,即提供了链接性为内部的静态变量的替代品。
3.名称空间的使用理念
- 使用在已命名的名称空间中声明的变量,而不是使用外部全局变量。
- 使用在已命名的名称空间中声明的变量,而不是使用静态全局变量。
- 如果开发一个函数库或类库,将其放在一个名称空间中。例如c++提倡将标准函数库放在名称空间std中。
- 仅将编译指令using作为一种将旧代码转换为使用名称空间的权宜之计。
- 不要在头文件中使用using编译指令。首先,这样做掩盖了要让哪些名称可用;另外,包含头文件的顺序可能影响程序的行为。如果非要使用,应将其放在所有预处理器编译指令#include之后。
- 导入名称时,首先使用作用域解析运算符或using声明方法。
- 对于using声明,首先将其作用域设置为局部而不是全局。
原文地址:https://www.cnblogs.com/linuxcoffe/p/8906514.html
时间: 2024-10-11 17:59:34