在函数(见2.2.1节和第12章)、类(见第16章)和枚举(见2.33节和8.4节)之外, C++还提供了一种称为名字空间( namespace,见第14章)的机制,一方面表达某些声明是属于一个整体的,另一方面表明它们的名字不会与其他名字空间中的名字冲突。例如,我们尝试利用自己定义的复数类型(见3.2.1.1节,18.3节和40.4节)进行实验:
namespace Mycode{class complex{/*...*/}complex sqrt(complex);//...int main();}int Mycode::main(){complex z{1,2};auto z2=sqrt(z);std::cout<<'{'<<z2.real()<<','<<z2.imag()<<"}\n";//...}int main(){return Mycode::main();}
通过将代码放在名字空间Mycode中,就可以确保我们的名字不会和名字空间std(见4.1.2节)中的标准库名字冲突。因为标准库确实支持 complex算术运算(见3.2.1.1节和40.4节),所以提前设置这样的预防措施显然是非常明智的。
要想访问其他名字空间中的某个名字,最简单的方法是在这个名字前加上名字空间的名字作为限定(例如std:cout和 Mycode::main)。“真正的main()”定义在全局名字空间中,换句话说,它不属于任何自定义名字空间、类或函数。要想获取标准库名字空间中名字的访问权,我们应该使用 using指示(见14.2.3节):
using namespace std;
名字空间主要用于组织较大规模的程序组件,最典型的例子是库。使用名字空间,我们就可以很容易地把若干独立开发的部件组织成一个程序。
