- 1、本文档共52页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
如果程序员乙写了头文件header2.h,在其中除了定义其他类以外,还定义了类Student和函数fun,但其内容与头文件header1.h中的Student和函数fun有所不同。 源码参见4-4/header2.h。 假如主程序员在其程序中要用到header1.h中的Student和函数fun,因而在程序中包含了头文件header1.h,同时要用到头文件header2.h中的一些内容,因而在程序中又包含了头文件header2.h。源码参见4-4/2.cpp 这时程序编译就会出错。 因为在预编译后,头文件中的内容取代了对应的#include命令行,这样就在同一个程序文件中出现了两个Student类和两个fun函数,显然是重复定义,这就是名字冲突,即在同一个作用域中有两个或多个同名的实体。 不仅如此,在程序中还往往需要引用一些库,为此需要包含有关的头文件。如果在这些库中包含有与程序的全局实体同名的实体,或者不同的库中有相同的实体名,则在编译时就会出现名字冲突。 为了避免这类问题的出现,人们提出了许多方法,例如: 将实体的名字写得长一些;把名字起得特殊一些,包括一些特殊的字符;由编译系统提供的内部全局标识符都用下划线作为前缀,如_complex(),以避免与用户命名的实体同名;由软件开发商提供的实体的名字用特定的字符作为前缀。但是这样的效果并不理想,而且增加了阅读程序的难度,可读性降低了。 C语言和早期的C++语言没有提供有效的机制来解决这个问题,没有使库的提供者能够建立自己的命名空间的工具。人们希望ANSI C++标准能够解决这个问题,提供一种机制、一种工具,使由库的设计者命名的全局标识符能够和程序的全局实体名以及其他库的全局标识符区别开来。 2.2 什么是命名空间 为了解决上面这个问题,ANSI C++增加了命名空间(namespace)。所谓命名空间,实际上就是一个由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。如: namespace ns1//指定命名空间ns1 { int a; double b; } 现在命名空间成员包括变量a和b,注意a和b仍然是全局变量,仅仅是把它们隐藏在指定的命名空间中而已。 如果在程序中要使用变量a和b,必须加上命名空间名和作用域分辨符“::”,如ns1::a,ns1::b。这种用法称为命名空间限定(qualified),这些名字(如ns1::a)称为被限定名(qualified name)。C++中命名空间的作用类似于操作系统中的目录和文件的关系。 命名空间的作用是建立一些互相分隔的作用域,把一些全局实体分隔开来,以免产生名字冲突。 可以根据需要设置许多个命名空间,每个命名空间名代表一个不同的命名空间域,不同的命名空间不能同名。这样,可以把不同的库中的实体放到不同的命名空间中。过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。 在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型: 变量(可以带有初始化); 常量; 函数(可以是定义或声明); 结构体; 类; 模板; 命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。 例如: namespace ns1 { const int RATE=0.08; //常量 double pay; //变量 double tax( ) //函数 { return pay*RATE; } namespace ns2 //嵌套的命名空间 { int age; } } 如果想输出命名空间ns1中成员的数据,可以采用下面的方法: coutns1::RATEendl; coutns1::payendl; coutns1::tax()endl; coutns1::ns2::ageendl; //需要指定外层的和内层的 //命名空间名 2.3 使用命名空间解决名字冲突 现在,对例4.4程序进行修改,使之能正确运行。 例4.5 利用命名空间来解决例4.4程序名字冲突问题。 修改两个头文件,把在头文件中声明的类分别放在两个不同的命名空间中。 源码参见4-5 程序能顺利通过编译,并得到以下运行结果: 101 Wang 18(对象stud1中的数据) 2.82843 (5+3的
您可能关注的文档
- 20101201入党积极分子培训班试卷1.doc
- 大一毛概复习考题重点资料.doc
- 南开17春秋学期公共关系学在线作业.doc
- 毛概复习总结概论.doc
- 2011必威体育精装版党课考试试题题库和答案划过.doc
- 第6课时第2章连锁超市类型和其运营模式第3节自由连锁特征和运营模式.doc
- 中国提出走与平发展道路的背景.doc
- 第五讲:入党积极分子考察表填写样式.doc
- 2014年陕西省公务 员的考试行测备考:经济常识.doc
- 党章学习题库剖析.doc
- 2016年度人大马克思主义理论考研,复试真题,考研真题,考研大纲,考研笔记,考研经验.pdf
- 2015年度中央财经大学金融学考研真题汇总11.pdf
- 启发财商对创业者作用.ppt
- 从社会管理创新角度看城市管理领域相对集中行政处罚权制度的完善与发展.pdf
- 。在学校改革实践中造就新型教师——《面向21世纪新基础教育探索性研究》提供的启示及经验.pdf
- 3-23邱尊社第四讲(不含导论):社会主义本质及建设中国特色社会主义总任务.ppt
- 甘肃兰大附中(33中)2013届高三政治调研卷(五).doc
- 周思敏:这就是教养!一定要教给孩子25条礼仪.pdf
- 超现实主义的发展过程与理论主张.pdf
- 当代西方市场社会主义形成原因探析.pdf
文档评论(0)