- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 命名空间 控制连接 (1)编译单元 (2)内部连接 (3)外部连接 编译单元 当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件 就是一个编译单元。这个编译单元会被编译成为一个与cpp文件名同名的目标文件(.o或是.obj)。连接程序把不同编译单元中产生的符号联系起 来,构成一个可执行程序。 内部连接 (1)内部连接:如果一个名称对于它的编译单元来说是局部的,并且在连接时不会与其它编译单元中的同样的名称相冲突,那么这个名称有内部连接(注:有时也将声明看作是无连接的,这里我们统一看成是内部连接的)。 内部连接 (2)以下情况有内部连接: 所有的声明。 名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义。 enum定义。 inline函数定义(包括自由函数如果一个函数是自由函数,那么这个函数不是类的成员函数,也不是友元函数。 和非自由函数)。 类的定义。 名字空间中const常量定义。 union的定义。 外部连接 (1)外部连接:在一 个多文件程序中,如果一个名称在连接时可以和其它编译单元交互,那么这个名称就有外部连接。 外部连接 (2)以下情况有外部连接: 类非inline函数总有外部连接。包括类成员函数和类静态成员函数。 类静态成员变量总有外部连接。 名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量。 内部连接与外部连接 注意:对于全局变量和函数,定义时如果指定是static,则是内部连接;指定extern,是外部连接。默认为extern。 命名空间的概念 C语言中的预处理、静态处理等会引起命名冲突。 命名空间(也叫名字空间、名称空间)是用来限定名称的解析和使用范围的,以解决命名冲突。 命名空间是一个逻辑上的类型组织系统,用它来对程序中的类型进行逻辑上的分组,并使定义在同一个命名空间中的类可利用命名空间直接相互调用。 标准的C++有命名空间机制,使用namespace关键字。库或程序中的每一个C++定义集被封装在一个命名空间中,如果其他的定义中有相同的名字,但它们在不同的命名空间,则不会产生命名冲突。 命名空间的定义 格式: namespace 命名空间名 { // 命名空间成员(其他命名空间或类的定义) } 说明: 命名空间只能在全局范围内定义。 “命名空间名”是C++合法的标识符,也可以是用作用域分解运算符(::)来构成的命名空间的完全限定名。可以没有命名空间名(无名的命名空间),其成员的名称不需要限定就可以使用。 不允许在定义命名空间时使用任何访问修饰符。系统默认命名空间具有public访问属性。但可以在一个命名空间的类定义中插入一个友元声明。 命名空间的定义 说明(续): 命名空间的成员可以是另一个命名空间(嵌套)或类型(类、结构、接口、枚举等)的定义。 一个命名空间可以在多个头文件中用一个标识符来定义,就好像重复定义一个类一样。 一个命名空间的名字可以用另一个名字来作它的别名,这样就不必敲打那些开发商提供的冗长的名字了。 不能像类那样去创建一个命名空间的实例。 可以在一个编译单元中包含一个未命名的命名空间,但只能包含一个未命名的命名空间。 在命名空间的结尾,右花括号的后面可以跟一个分号(;)。 见例Example_3_1 命名空间的使用 访问一个命名空间中的成员可以采用下面三种方法: 直接访问命名空间的成员(完全限定名):用作用域分解运算符(::)。见例Example_3_2。 缺点:输入繁琐。 使用声明:用using声明一次性引用名字。见例Example_3_3。 using 命名空间名::成员名; 缺点:缺乏类型信息,不能克服重载问题。 使用指令:用using指令把所有名字引入到命名空间中。见例Example_3_4。 using namespace 命名空间名; 缺点:可能会产生命名冲突。 命名空间的使用小结 无名的命名空间允许无限制地使用其成员,并且为其成员提供了内部连接。 如果不想由于引入不同命名空间而导致重复定义一个函数时,可以使用using声明,它不会引起任何二义性和重复。 对一个实现文件(.cpp文件):使用一个全局using指令是一个好方法。因为只有在该文件编译结束时,using指令才会起作用。 对于一个头文件(.h文件):最好使用明确的限定或者被限定在一定范围内的using指令和using声明,而不能把一个全局using指令引入到一个头文件中(因为那将意味着包含这个头文件的任何其他头文件也会打开这个命名空间)。 命名空间的别名 使用命名空间的完全限定名会觉得太繁琐,命名空间的别名能够解决这个问题。 格式: namespace
文档评论(0)