高质量C++编程指南:C++名字空间_第1页
高质量C++编程指南:C++名字空间_第2页
高质量C++编程指南:C++名字空间_第3页
高质量C++编程指南:C++名字空间_第4页
高质量C++编程指南:C++名字空间_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章、C++名字空间

C++在1995年才正式引入名字空间技术,主要目的就是为了解决大型软件项目开发组之间以及同一开发组内各开发人员的代码中存在的名字冲突问题。C++名字空间的作用和文件目录类似,即设立一些围墙来隔离不同模块中的名字集合。一、为什么要使用名字空间?

程序员总是喜欢使用短小而简单的类名、函数名、全局变量名等,在大型软件项目中这样做不可避免地会导致不少标识符同名,在编译时将指出重复定义错误;另一方面,在使用系统提供的库函数或者第三方的库函数时,也会碰到同名冲突。

对于多重库冲突可以采取三种选择:

得到库的原代码修改并重新编译它们;确信其中的一个类提供者更改了标识符的名称并重新发布了他自己的库;或者选择不使用其中一个冲突库。但经常出现这样的情况:没有任何一种选择是可行的。

对于自己项目中的标识符的名字冲突,程序员首先想到是修改名字,但是这种方法的缺点也是显然的:

名字冲突的每一处都要修改,很麻烦。修改名字时可能会引入新的错误。

C++解决这类日益增多的问题的办法是使用名字空间,它是标识符使用范围的一个附加层,能够使程序员创造有意义的符号名称而不必顾忌所有其他人的工作。即使出现令同名现象也不会导致二义性和重复定义的错误。

名字空间的一个例子是std,它是C++定义其库标识符的名字空间,为了使用cout流对象,你必须告诉编译器cout已经存在于std名字空间中。为了达到上述目的可以指定名字空间的作用域限定操作符(::)作为cout标识符的前缀。如:std::cout<<“hello!”<<endl;二、名字空间的特性

名字空间是C++新增的一种作用域,就像结构和类可以嵌套定义一样名字空间也可以嵌套定义,所不同的是:名字空间只是一种起屏蔽作用的隔板,所以不能实例化,而类则可以实例化出对象。使用名字空间不会带来任何额外的运行开销,不过会增加编译时间。例:namespacename1{intval1=20;intval2=100;}namespacename2{intval1=50;intval2=100;}namespaceclassfile{classA{public:voidfun();};}voidclassfile::A::fun(){std::cout<<“fun()called!”<<endl;}voidmain(void){cout<<name1::val1<<endl;cout<<name2::val2<<endl;classfile::Aa;a.fun();}

当你访问名字空间中的程序元素时,最笨的办法就是在每一个地方使用完全限定名,如果在加上嵌套的名字空间和嵌套的类定义,这个访问会很长,此时又2种解决办法:(1)使用typedef把引用序列映射为一个较短的类型名以简化书写。(2)使用using声明和using指令。using声明由关键字using紧跟namespace::member组成,using声明不受访问区段的限制,其声明的内容不改变原来的可见性。using指令告诉编译器:如果没有特别的指明,下面出现的名字将尝试在指定的名字空间中查找。其语法为:usingnamespace名字空间名;voidmain(void){usingnamespacestd;cout<<“hello!”<<endl;}

名字空间的重要特性是它可以扩展,同一个文件中可以通过直接给名子空间增加内容来扩展。不要企图扩展标准名字空间,否则出现结构未定义。三、定义名字空间:一个名字空间可以包含多种类型的标识符,如:变量名;常量名;函数名;结构名;类名;名字空间名;一个名字空间可以在2个地方被定义:一个是在全局范围层次;第二是在另一个名字空间中被定义。1、全局范围定义字空间:例:namespacename1{intval1=20;intval2=100;}namespacename2{intval1=50;intval2=100;}voidmain(){cout<<name1::val1<<endl;cout<<name2::val2<<endl;}2、嵌套名字空间:名字空间可以在名字空间中被定义,在这种情况下,仅仅通过使用外部的名字空间作为前缀,一个程序就可以引用在名字空间之外定义的其他标识符,而在名字空间的内部定义的标识符需要作为外部和内部名字空间名称前缀出现。namespacename1{intval1=20;intval2=100;namespacename2{intval1=50;intval2=100;}}voidmain(){cout<<name1::val1<<endl;cout<<name1::name2::val2<<endl;}3、无名名字空间尽管给定名字空间的名称是有益的,但你可以通过在定义中省略名字空间的名称,简单地声明无名名字空间,如:namespace{

intval1=50;intval2=100;}

在无名名字空间中定义的标识符被设置为全局的名字空间,这几乎破坏了名字空间设置的最初目标,基于这样的原因,无名名字空间并未被广泛使用。4、名字空间的别名:可以给名字空间起别名,它是已经定义的名字空间的可替换名称。通过将别名指定给当前的名字空间的名称,就可以简单的创建一个名字空间的别名。如:namespaceglobalname{intval1=50;intval2=100;}namespacestr=globalname;voidmain(){cout<<str::val1<<endl;cout<<str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论