第15章 名称空间
大型程序往往是由团队开发的,即使是个人编写的程序,随着代码量的增多,变量、函数和类等重名及相互冲突的现象时有发生,有些情况下编译器会指明错误所在,但有时候会发生一些察觉不到的覆盖,让程序员对出现的错误摸不着头脑。
很多厂商也提供了快捷的第3方类库,用户不用关心库中的类是如何实现的,只要知道如何调用接口使用即可,但不同厂商定义的变量、函数和类可能会发生冲突,同样是初始化操作,甲公司类库提供了initial函数,乙公司可能也提供了initial函数,如果在程序中同时使用了两个公司的类库,initial函数将对应哪个版本呢?
为了解决这些问题,新的C++标准提供了名称空间机制。旧标准中(ANSI/ISO 1998)并没有该项机制,所以一些特别老的编译器可能并不支持名称空间特性。
本章主要涉及以下知识点。
❑名称空间:介绍名称空间的概念及其定义。
❑实体的作用和可见域:介绍实体的概念、作用和可见域的相关知识。
❑名称空间的作用和可见域:介绍名称空间的定义和使用。
❑名称空间的思考:介绍名称空间使用的基本原则。
15.1 什么是名称空间
旧的标准中,仅依靠名称在程序中的作用域和可见域来区分同名实体,在第6章中已经介绍了实体的作用域和可见域的概念,由于“屏蔽”等原因,可见域一般是作用域的子集。
注意
旧标准中使用诸如“#include<iostream.h>”形式的头文件,而新标准中只要使用“#include<iostream>”即可,旧标准中不需要using指令指明名称空间,而新标准中需要这样做。
15.1.1 名称空间范例
名称空间通过定义一种新的声明区域来创建命名的名称空间,一个名称空间中的实体不会和另外一个名称空间中的同名实体相冲突,来看一个简单形象的例子如代码15.1所示,其既能说明名称空间是怎么回事,又演示了如何定义全局的名称空间。
代码15.1 使用名称空间UseNamespace
<—————————————-文件名:example1501.cpp—————————————> 01 #include<iostream> 02 using namespace std; 03 namespace yaya//创建名称空间yaya 04 { 05 extern int num=1;//yaya中对num的定义性声明 06 class Ex//yaya中对Ex的类定义 07 { 08 public: 09 void hello() 10 { 11 cout<<"This is yaya"<<endl; 12 cout<<num<<endl; 13 } 14 }; 15 } 16 namespace abao//创建名称空间abao 17 { 18 extern int num=2;//abao中对num的定义性声明 19 class Ex//abao中对Ex的类定义 20 { 21 public: 22 void hello() 23 { 24 cout<<"This is abao"<<endl; 25 cout<<num<<endl; 26 } 27 }; 28 } 29 int main() 30 { 31 yaya:Ex obY;//使用yaya中的类Ex 32 abao:Ex obA;//使用abao中的类Ex 33 obY. hello(); 34 obA. hello(); 35 return 0; 36 }
输出结果如下所示。
This is yaya 1 This is abao 2
【代码解析】代码第3和16行定义了两个全局性的名称空间yaya和abao,虽然两个名称空间中都定义了类Ex,也都定义性声明了全局变量num,通过使用限定符,如yaya:Ex和abao:Ex可以有效地对两个名称空间中定义的实体进行区分,如果没有引入名称空间机制,这是不可能实现的。