C++语言程序设计
上QQ阅读APP看书,第一时间看更新

2.6 命名空间

在使用变量时,需要注意命名冲突问题,C++语言引入命名空间来减少和避免命名冲突。例如,有两个学生:一个叫小千,一个叫小锋,他们各自拥有一本C++语言课本,为了区分这两本C++语言课本,他们就在自己的课本封面写上自己的名字。同理,如果在同一作用域中定义两个相同数据类型的同名变量,则会出现重复定义的编译错误。采用命名空间,就可以避免这种情况的发生。命名空间的定义格式如下所示:

namespace是定义命名空间的关键字,命名空间名称可以用任意合法的标识符,在{}内声明空间成员,在命名空间中声明或定义的任何东西都局限于该命名空间内。

当命名空间外的作用域要使用空间内定义的标识符时,有以下3种方法:

(1)使用命名空间名称加上域解析操作符“∷”来表明要使用的成员,其语法格式如下:

     命名空间名称::成员;

(2)使用using关键字来表明整个命名空间,此时该命名空间中的所有成员都会被引入到当前范围中,其语法格式如下:

     using namespace命名空间名称;

(3)使用using关键字能使指定的命名空间中的指定成员在当前范围中变为可见,其语法格式如下:

     using命名空间名称::成员;

接下来演示命名空间的作用及使用方法,如例2-12所示。

例2-12

运行结果如图2.23所示。

图2.23 例2-12运行结果

在例2-12中,程序中有3个名为a的变量名,但它们的值都是不一样的。第2行到第5行,定义了一个命名空间A,该命名空间中包含一个变量a,它的值为1;第6行到第9行,定义了一个命名空间B,该命名空间中包含一个变量a,它的值为2;第12行,在main函数中又定义了一个变量a,它的值为3。第13行演示了对3个同名变量的读取,main函数中定义的a可以直接以变量名进行读取,在命名空间中定义的变量名需要注明其所属的命名空间。

假如读者还是不理解命名空间的作用,可以尝试将命名空间A和B中的变量名a释放出来,然后再试着输出变量a的值,如例2-13所示。

例2-13

该程序编译后,出现一条错误信息:

     error:reference to  'a'is ambiguous.

上面的错误信息指出a引起了歧义,由于该程序第12行和第13行将命名空间A和B的所有成员都释放出来,导致在第14行产生歧义,程序不知此处访问哪个命名空间下的a,因此程序编译失败。