C++之命名空间(End Chapter)
http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/20/2146917.html
今天这一节,注意要讲C++中的命名空间和头文件的命名规则。也是C++这一基础系列的最后一节。首先感谢在学习C++的一路上,有这么多关注这系列的博友们的陪伴和帮助。正因为有了你们的建议和指导,使我对C++有了更深的认识和更大的兴趣。这个系列结束之后,我会继续学习和关注C++的一些实际应用。
大家都知道一个大型软件通常是由多个模块组成的,这些模块往往是由不同的人合作完成,最后组成一个完整的程序。假如不同的人分别定义了函数和类,放在不同的头文件中,在主文件需要用到这些函数和类时,用#include命令行将这些头文件包括进来。但由于各个头文件是由不同的人设计的,可能在不同的头文件中会有相同的名字来定义函数或类,这样就会出现命名冲突的问题。同时如果在程序中用到第三方类库,也会有同样的问题。为解决这一问题,ANSI/ISO C++引入命名空间,即一个程序设计者命名的内存区域。程序设计者根据需要指定命名空间,并将命名空间中声明的标识符和命名空间关联起来,这样就保证不同命名空间的同名标识符不发生冲突。它的一般格式:
namespace 命名空间名
{
标识符1;
标识符2;
...
}
花括号内是命名空间的作用域。其实在之前所有的章节中都用到过一个C++指定的一个标准命名空间std。是否还记得在C++的发展,特点和源程序构成 这一节中的示例里用到过using namespace std语句,其含义就是使用标准命名空间std。它是单词standard的缩写,标准C++库中的所有标识符都在这个命名空间中,比如我们常用到的iostream头文件中的函数、类、对象等都在std命名空间中定义。如果要调用命名空间里的函数、类、对象等,有两种方法:(1)在原文件中使用"using namespace 命名空间名",再直接调用标识符;(2)在标识符前面加上命名空间以及作用域运算符"::";
自定义头文件university.h:
1 namespace Peking //声明命名空间Peking
2 {
3 int rank=47;//标识符
4 }
5
6 namespace Tsinghua //声明命名空间Tsinghua
7 {
8 int rank=54;//与Peking同名标识符
9 }
使用文件university.h及命名空间:
1 #include "stdafx.h"
2 #include <iostream>
3
4 #include "university.h"//加载头文件university.h
5 usingnamespace Peking;//显式使用头文件university.h中的命名空间Peking
6
7 int main()
8 {
9 std::cout<<"世界大学排名(2010)"<<std::endl;
10
11 std::cout<<"北京大学:"<<rank<<std::endl;//rank等同于Peking::rank
12 std::cout<<"清华大学:"<<Tsinghua::rank<<std::endl;//标识符rank前面加上命名空间Tsinghua以及作用域运算符"::"
13
14 return0;
15 }
结果:
最后来说说C++中头文件的命名规则,因为C++是从C语言发展而来的,为了与C兼容,C++保留了C语言中的一些规定,其中就包括用.h作为后缀的头文件,比如大家所熟悉的:stdio.h、math.h和string.h等。但后来ANSI/ISO C++建议头文件不带后缀".h"。但为了使原来编写的C++的程序能够运行,在C++程序中的头文件既可以采用不带后缀的头文件,也可以采用C语言中带后缀的头文件。在C++中使用这两种形式的头文件都可以,只不过有几个注意点需要说明一下:(1)如果C++程序中使用了带后缀".h"的头文件,那么不必在程序中声明命名空间,只需要文件中包含头文件即可;(2)C++标准要求系统提供的头文件不带后缀".h",但为了表示C++与C的头文件既有联系又有区别,C++中所用头文件不带后缀".h",而是在C语言的相应头文件名之前加上前缀c:
1 #include <cstdio>//等同于C中的#include<stdio.h>
2 #include <cstring>//等同于C中的#include<string.h>
3 #include <cmath>//等同于C中的#include <math.h>