理论教育 命名空间的作用及使用方法-《面向对象程序设计》

命名空间的作用及使用方法-《面向对象程序设计》

时间:2023-10-25 理论教育 版权反馈
【摘要】:使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。在命名空间出现之前,整个C++库都是定义在全局命名空间中的。引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。

命名空间的作用及使用方法-《面向对象程序设计》

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我们在自己的程序中定义了一个函数toupper(),这将重写标准库中的toupper()函数,这是因为这两个函数都是位于全局命名空间中的。命名冲突还会发生在一个程序中使用两个或者更多的第三方库的情况中。此时,很有可能,其中一个库中的名称和另外一个库中的名称是相同的,这样就冲突了。这种情况会经常发生在类的名称上。比如,我们在自己的程序中定义了一个Stack类,而我们程序中使用的某个库中也可能定义了一个同名的类,此时名称就冲突了。

namespace关键字的出现就是针对这种问题的。由于这种机制对于声明于其中的名称都进行了本地化,就使得相同的名称可以在不同的上下文中使用,而不会引起名称的冲突。在命名空间出现之前,整个C++库都是定义在全局命名空间中的(这当然也是唯一的命名空间)。引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。这样就减少了名称冲突的可能性。我们也可以在自己的程序中创建自己的命名空间,这样可以对我们认为可能导致冲突的名称进行本地化。

通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。

C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

<iostream> 和<iostream.h> 格式不一样,前者没有后缀,实际上,在编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件C++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h> 时,相当于在C 中调用库函数,使用的是全局命名空间,也就是早期的C++实现;当使用<iostream > 的时候,该头文件没有定义全局命名空间,必须使用using namespace std,这样才能正确使用cout和cin等。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

(1)直接指定标识符。例如std::ostream 而不是ostream。完整语句如下:

std::cout< < std::hex< < 3.4< < std::endl;

(2)使用using关键字。using std::cout;using std::endl;using std::cin; 以上程序可以写成:

cout< < std::hex< < 3.4< < endl;

(3)最方便的就是使用using namespace std; 例如,

using namespace std;(www.daowen.com)

这样命名空间std内定义的所有标识符都有效。就好像它们被声明为全局变量一样。那么以上语句可以如下写:

cout< <hex< < 3.4< < endl;

因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。但这又产生一个新问题:无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,它们都是在全局空间下的。所以就有了 < iostream.h > 和<iostream > 等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加“.h”。

为了让学生了解C++程序结构,下面以一个最简单的C++程序来分析C++的程序结构。

【例1.1】一个最简单的C++程序,输出“C++is Very Good!”。

请读者分析一下,本程序与C语言程序有何不同?

(1)标准C++规定,main()函数必须声明为int型,因此,在main()的最后返回一个整型0值传给操作系统

(2)C++不但兼容C语言中“/∗ ……….∗/”形式的注释,还新增加了以“//”开头的注释。“//”是单行注释,不能跨行。

(3)C++中用cout进行输出代替C语言中printf()函数。cout实际上是C++系统预定义的对象名,称为输出流对象。“< < ”运算符是一个“插入运算符”,与cout联合使用,将运算符右边的值(即右操作数)插入到输出流中。

(4)使用cout需要使用头文件iostream。#include预处理命令与C 语言中使用类似,用于把后面的头文件包含到当前文件中。C++标准要求,由系统提供的头文件不带后缀.h,程序员自己定义的头文件可以有.h。当然,C++程序可以使用C 语言编译系统提供的带.h的头文件。

(5)语句“using namespace std;”的意思是“使用命名空间std”。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈