- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
15章名称空间(Namespace)ppt课件
第15章 名称空间(Namespace) 大型程序往往是由团队开发的,即使是个人编写的程序,随着代码量的增多,变量、函数、类等重名、相互冲突的现象时有发生,有的情况下,编译器会指明错误所在,但有时候会发生一些察觉不到的覆盖,让程序员对出现的错误摸不着头脑。 很多厂商也提供了快捷的第3方类库,用户不用关心库中的类是如何实现的,直到如何调用接口使用即可,但多个厂商定义的变量、函数和类可能会发生冲突,同样是初始化操作,甲公司类库提供了initial函数,乙公司可能也提供了initial函数,如果在程序中同时使用了两个公司的类库,initial函数对应哪个版本呢? 为了解决这些问题,新的C++标准提供了名称空间机制。旧标准中(ANSI/ISO 1998)并没有该项机制,所以,一些特别老的编译器可能并不支持名称空间特性。 15.1 什么是名称空间 旧的标准中,仅仅依靠名称在程序中的作用域和可见域来区分同名实体,在第6章中已经介绍了实体的作用域和可见域的概念,由于“屏蔽”等原因,可见域一般是作用域的子集。 旧标准中使用诸如“#include iostream.h”形式的头文件,而新标准中只要使用“#include iostream”即可,旧标准中不需要using指令指明名称空间,而新标准中需要这样做。 15.1.1 名称空间范例 名称空间通过定义一种新的声明区域来创建命名的名称空间,一个名称空间中的实体不会和另外一个名称空间中的同名实体冲突,来看一个简单形象的例子,其既能说明名称空间是怎么回事,也演示了如何定义全局的名称空间。 15.1.2 定义名称空间 C++中定义名称空间的基本格式为: namespace 名称空间名 { 变量类型 变量; 函数返回类型 函数原型; } 15.2 实体的作用域与可见域 名称空间可以如中的yaya和abao一样,定义成全局的,也可以将一个名称空间定义在另一个名称空间内,形成名称空间的嵌套,但名称空间的定义不能在代码块内,因此,默认情况下,名称空间中的实体作用域是全局的。 15.2.1 实体可见域 名称空间中实体的作用域是全局的,并不意味着其可见域也是全局的,如果不使用作用域限定符和using机制,抛开名称空间嵌套和内部屏蔽的情况,实体的可见域是从实体创建到该名称空间结束(如果有名称空间的嵌套,则内部名称空间中的实体可能会屏蔽外部名称空间中的实体,这在稍后会讲到),在名称空间外,该实体是不可见的。 来看一段示例,见代码15?2 。 15.2.2 可见域的扩展 在某个名称空间中定义或创建的程序实体,如果要在其他名称空间中或外部函数中访问,必须使用作用域限定符::或使用using声明机制来使实体可见,这可看作是作用域的扩展,来看一段示例,对进行修改,见代码15?3 。 15.2.3 using声明机制 如果不希望在每次使用名称空间中实体时都使用作用域限定符,可使用using声明机制扩展其可见域,using声明的基本格式为: using 名称空间::实体名; 如“using A::dispA()”,至于using声明语句将该实体的可见域扩展到什么程度,这取决于using语句的书写位置,换言之,这取决于using语句的可见域。 1. using声明在全局区域 2. using声明语句在局部 15.2.4 using声明带来的多重声明问题(二义性) 如果using声明使用不当,很容易引起多重声明错误(multiple declaration),比如,已经定义了全局函数disp,却还使用全局using声明语句“using A::disp”,假设没有屏蔽发生,那么调用disp()时,编译器不确定是全局函数版本还是A::disp(),引发多重声明错误。 变量名同样存在这种问题,假设有两个名称空间A、B中都定义了int型变量num,在程序的某处需要使用num,如果写出如下代码: using A::num; using B::num; num=5; 则最后一句对num的赋值操作具有二义性,因此,应合理使用using声明机制。 15.2.5 空间内的“屏蔽” 在一个空间内,变量作可见域的规则,如内部变量对外部变量的屏蔽等是和第6章中介绍的内容使一致的,通过一个例子来形象地说明这一点,见。 15.2.6 先声明,后使用 和普通变量一样,在使用名称空间中的实体前,必须保证其有效,举例来说,在使用一个变量前,必须对该变量进行声明。例如,如果将中名称空间A定义修改为: namespace A //创建名称空间A { void dispA() { int num=3; coutdispA函数中的num: numendl; coutA中的num: A::numendl; coutB中的num: B::
文档评论(0)