在函数(见2.2.1节和第12章)、类(见第16章)和枚举(见2.33节和8.4节)之外, C++还提供了一种称为名字空间( namespace,见第14章)的机制,一方面表达某些声明是属于一个整体的,另一方面表明它们的名字不会与其他名字空间中的名字冲突。例如,我们尝试利用自己定义的复数类型(见3.2.1.1节,18.3节和40.4节)进行实验:

    1. namespace Mycode
    2. {
    3. class complex{/*...*/}
    4. complex sqrt(complex);
    5. //...
    6. int main();
    7. }
    8. int Mycode::main()
    9. {
    10. complex z{1,2};
    11. auto z2=sqrt(z);
    12. std::cout<<'{'<<z2.real()<<','<<z2.imag()<<"}\n";
    13. //...
    14. }
    15. int main()
    16. {
    17. return Mycode::main();
    18. }

    通过将代码放在名字空间Mycode中,就可以确保我们的名字不会和名字空间std(见4.1.2节)中的标准库名字冲突。因为标准库确实支持 complex算术运算(见3.2.1.1节和40.4节),所以提前设置这样的预防措施显然是非常明智的。
    要想访问其他名字空间中的某个名字,最简单的方法是在这个名字前加上名字空间的名字作为限定(例如std:coutMycode::main)。“真正的main()”定义在全局名字空间中,换句话说,它不属于任何自定义名字空间、类或函数。要想获取标准库名字空间中名字的访问权,我们应该使用 using指示(见14.2.3节):

    1. using namespace std;

    名字空间主要用于组织较大规模的程序组件,最典型的例子是库。使用名字空间,我们就可以很容易地把若干独立开发的部件组织成一个程序。