1 命名空间
在C/C++中,变量、函数和类都是大量存在的,这些变量、函数、类的名称将都存在于全局作用域中,可能会导致很多冲突。 使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
C语言中命名冲突示例:
如上图所示:在左部分代码中,我们没有包含头文件stdlib.h,运行后正常输出了全局变量 rand
的值;而在右部分代码中,我们包含了头文件stdlib.h,此时再运行程序,报错说明 rand
发生了重定义,之前的 rand
是被定义为一个函数。显然,这是因为 rand
是stdlib.h中声明的库函数,当我们在包含了stdlib.h头文件的同时又声明了与函数同名的 rand
全局变量时就会发生命名冲突,进而导致程序无法正常运行。
命名冲突通常发生于以下几种情况:
- 我们自己定义的变量、函数、类与库里的名字发生命名冲突。
- 在项目组中,多个人之间定义的名字发生冲突。可能单个人运行自己的代码时是正常的,可当将多人的代码进行合并后,运行就发生了命名冲突。
命名冲突问题是C语言的一个缺陷,在C语言中没有办法很好解决这个问题。因此,C++在C语言的基础上增加了命名空间的概念以解决这个问题。
在认识命名空间之前,我们先了解一个相对于C语言C++中新增的操作符:域操作符(域作用符) ::
(双冒号),当全局变量与某个函数中的局部变量重名时,即可用 ::
来区分,表示要使用哪个域中的同名变量。如下示例:当函数中定义有与全局变量同名的变量时,默认情况下,调用函数会优先使用函数中的同名局部变量;如果想要在该函数中使用同名全局变量,则需要用域作用符 ::
来修饰变量(格式如下图代码中所示),当域作用符左边无其它名称时(如命名空间),则默认表示全局域,使用全局变量。
1.1 命名空间定义
定义一个命名空间实际上就是定义一个域,命名空间中的所有内容都局限于该空间中。命名空间的定义只影响使用,不影响生命周期。定义命名空间需要使用
namespace
关键字。后跟空间名字,然后接一对{}
即可,{}
中即为命名空间中的成员。
定义方式:
- 正常命名空间定义
namespace (域名或空间名)
{
{\kern 8pt} //命名空间中的成员:可以定义变量、函数、类。如下例:
{\kern 8pt} int rand = 10; //全局变量
{\kern 8pt} //函数
{\kern 8pt} int Add(int num1, int num2)
{\kern 8pt} {
{\kern 16pt}