c++名字空间

上传人:w****i 文档编号:106195783 上传时间:2019-10-14 格式:PDF 页数:7 大小:136.09KB
返回 下载 相关 举报
c++名字空间_第1页
第1页 / 共7页
c++名字空间_第2页
第2页 / 共7页
c++名字空间_第3页
第3页 / 共7页
c++名字空间_第4页
第4页 / 共7页
c++名字空间_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《c++名字空间》由会员分享,可在线阅读,更多相关《c++名字空间(7页珍藏版)》请在金锄头文库上搜索。

1、C+C+C+C+名 字 空 间 说 明名 字 空 间 说 明 字号: 大 中 小 发布日期:2009-11-30发布者:admin浏览次数:130次 C+C+C+C+名字空间说明名字空间说明 1 1 1 1名字空间介绍名字空间介绍 在面对数百种第三方库, 这还未提及 C+可以接受的程序设计库, 程序员有时会发现提 供确信不和其他符号冲突的变量名和函数名是一个挑战, 标准 C+解决这类日益增多的问题 的办法就是使用名字空间, 它是标识符使用范围的一个附加层, 能够使一个程序员创造有意 义的符号名称而不必顾及所有其他人的工作。 简而言之, 名字空间既为一个名字范围区域, 名字空间中所有由程序员创建

2、的标识符可 以确保是唯一的假设程序员在名字空间中没有声明两个重名的标识符; 并假设以前以定 义的同名名字空间已不存在。可以像这个定义一个简单的名字空间: namespace MyNames intiVal1= 100; intiVal2= 200; 这里有两个整型变量iVal1和 iVal2被定义为 MyNames 名字空间的组成部分。当然,这 仅仅是一个介绍性的例子。在本章的后续部分,可以更详细的考察名字空间的定义。 2 2 2 2名字空间的成员名字空间的成员 名字空间的一个例子就是 std,它是 C+定义其库标识符的名字空间。为使用 cout 流对 象,你必需告诉编译器 cout 已存在于

3、 std 名字空间中。为达到上述目的可以指定名字空间的 名称和作用域限定操作符(:)作为 cout 标识符的前缀。如清单1-1程序所示: / /清单1-1 /文件名:Test.cpp / #include int main() std:cout“hello“; return 0; 清单1-1通过使用 cout 对象将流文本输出到屏幕上来显示短信息。注意 std 名字空间是 如何出现在 cout 对象名称前面的,这是到目前为止我们应该乐于接受的惯例。 3 3 3 3usingusingusingusing namespacenamespacenamespacenamespace 语句语句 使用已

4、在名字空间定义的标识符的另一种方法是将 using namespace 语句包含在涉及到 名字空间的源代码文件中。 例如: 清单1-2是清单1-1的别一种形式, 它包含了 using namespace 语句。 / /清单1-2 /文件名:Test1.cpp / #include using namespace std; int main() cout“hello“; return 0; 清单1-2的结果同清单1-1完全一样。然而,应该感谢 using namespace 语句,程序员不再 需要在 cout 流对象名称前加上 std 名字空间名称。不仅 cout 标识符不再需要 std 前缀,

5、而且 在 std 名字空间定义的其他任何标识符都是如此,因此这种方式可能节约大量的时间。然而 请注意, 并没有一种可以推荐的程序设计惯例, 因为使用名字空间语句基本上是在全局层次 设置特定的名字空间。这几乎违背了名字空间最初的目标。清单1-3示例了在将 using namespace 语句包含于程序中可能遇到的问题。 / /清单1-3 /文件名:Test2.cpp / #include namespace MyNames intiVal1= 100; intiVal2= 200; namespace MyOtherNames intiVal1= 300; intiVal2= 400; usin

6、g namespace std; using namespace NyNames; using namespace NyOtherNames; int main() cout“hello“; iVal1= 100; return 0; 当试图编译清单1-3中的程序时,大多数均会提示相应的出错信息。在为在语句 iVal1=100中, 编译器并不知道程序所指的是iVal1的哪种版本。 是在 MyNames 中定义的iVal1 还是在 MyOtherNames 定义的iVal1呢?编译器并没有办法识别。为了避免出现这种类型的 问题,应该将如清单1-3中所示的程序改写,如清单1-4所示,程序将会被正确

7、的编译和执行 。 / /清单1-4 /文件名:Test3.cpp / #include namespace MyNames intiVal1= 100; intiVal2= 200; namespace MyOtherNames intiVal1= 300; intiVal2= 400; int main() std:cout“hello“; MyNames:iVal1 = 100; return 0; 4 4 4 4定义名字空间定义名字空间 一个名字空间可以包含多种类型的标识符,如下面所列: 变量名 常量名 函数名 结构名 类名 名字空间名 一个名字空间可以在两个地方被定义: 在全局范围层次

8、或者是在另一个名字空间中被定 义(这样就形成一个嵌套名字空间) 。清单1-5给出了一个定义各种类型变量和函数的名字空 间定义。 / /清单1-5 /文件名:Test4.cpp / #include namespace NyNames const int MAX_LENGTH = 100; intiVali= 100; longiVal2 = 200L; charcr = Z; intAdd(int i,int j) return i+j; long Sub(long i,long j) return i-j; int main() std:coutNyNames:Add(NyNames:MAX

9、_LENGTH,NyNames:iVali); std:coutNyNames:Sub(NyNames:iVal2,NyNames:cr); return 0; 5 5 5 5嵌套名字空间嵌套名字空间 名字空间可以在其他名字空间中被定义。 在这种情况下, 仅仅通过使用外部的名字空间 作为前缀, 一个程序就可以引用名字空间之外定义的其他标识符。 然而在名字空间内部定义 的标识符需要作为外部和内部名字空间名称的前缀出现。清单1-6示例了嵌套名字空间。 / /清单1-6 /文件名:Test5.cpp / #include namespace MyOutNames intiVal1= 100; int

10、iVal2= 200; namespace MyInnerNames intiVal3= 300; intiVal4= 400; int main() std:coutMyOutNames:iVal1std:endl; std:coutMyOutNames:iVal2std:endl; std:coutMyOutNames:MyInnerNames:iVal3std:endl; std:coutMyOutNames:MyInnerNames:iVal4std:endl; return 0; 6 6 6 6无名名字空间无名名字空间 尽管给定名字空间的名称是有益的, 但你可以通过在定义中省略名字空

11、间的名称而简单地声 明无名名字空间,例如:下面的例子定义了一个无名名字空间,它包含了两个整型变量。 namespace MyNames intiVal1= 100; intiVal2= 200; 事实上, 在无名名字空间中定义的标识符被设置为全局的名字空间, 这几乎彻底破坏了 名字空间设置的最初目标。基于这个原因,无名名字空间并未被广泛应用。 7 7 7 7名字空间的别名名字空间的别名 可以给定名字空间的别名, 它是已定义的名字空间的可替换的名称。 通过将别名指定给 当前的名字空间的名称,你可以简单地创建一个一个名字空间的别名。清单1-7说明了名字 空间别名的使用。 / /清单1-7 /文件名

12、:Test6.cpp / #include namespace MyNames intiVal1= 100; intiVal2= 200; namespace MyAlias = MyNames; int main() std:coutMyAlias:iVal1std:endl; std:coutMyAlias:iVal2std:endl; return 0; 8 8 8 8名字空间综合举例名字空间综合举例 通过上面的学习我们了解了什么是名字空间以及名字空间的用途, 也举了大量的例子说 明了名字空间的使用; 但以上我们都是以单文件的形式说明名字空间的, 然而我们知道 C+ 程序是由头文件和源文

13、件组成的; 例如我产在头文件中定义了一个名字空间, 且在名字空间 中定义了一个类,那么如果在源文件中实现这个类呢?清单1-8说明了这种其实现方法。 / /清单1-8 /文件名:Test7.h / #ifndef TEST_H #define TEST_H namespace MyNames class TestClass public: , ;, ; void PrintVal(); TestClass(intiVal); private: int m_iVal; ; #endif / /清单1-8 /文件名:Test7.cpp / #include #include “ Test7.h “ namespace MyNames TestClass:TestClass(intiVal) m_iVal =iVal; void TestClass:PrintVal() std:coutm_iValstd:endl; / /清单1-8 /文件名:call.cpp / #include #include “ Test7.h “ int main() MyNames:TestClass rTest(800); rTest.PrintVal(); return 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号