把代码分发给其他部门的诸多困难中有一个是我们不知道全局名字会有什么样的影响。
例如在Intel 公司有人写了:
class Array { ... };
那么他就不能在相同的程序中既使用上面的Array 类又使用我们实现的那个Array 类。
名字的可视性使这两份实现代码相互排斥。
在C++标准化之前,解决这个问题的传统做法是在全局可见的名字前加上一个唯一的字
符串前缀。例如我们可以这样发行数组Array 类
class Cplusplus_Primer_Third_Edition_Array { ... };
虽然这个名字可能是惟一的,我们不能保证这一点,但是写起来并不方便。标准C++
的名字空间机制是C++语言针对这个问题提供的语言一级的解决方案。
名字空间机制允许我们封装名字,否则,这些名字就有可能会污染、影响全局名字空间。
pollute the global namespace 一般来说,只有当我们希望自己的代码被外部软件开发部
门使用时才使用名字空间。例如,我们可以这样封装Array 类
namespace Cplusplus_Primer_3E {
template <class elemType>
class Array { ... };
// ...
}
关键字namespace 后面的名字标识了一个名字空间,它独立于全局名字空间。我们可以
在里面放一些希望声明在函数或类之外的实体名字空间,井不改变其中的声明的意义,只是
改变了它们的可视性,在继续讨论之前先扩展我们的可用名字空间集
namespace IBM_Canada_Laboratory {
template <class elemType>
class Array { ... };
class Matrix { ... };
// ...
}
namespace Disney_Feature_Animation {
class Point { ... };
template <class elemType, int size>
class Array { ... };
// ...
}
如果名字空间内的声明对程序而言不是立即可见的,那么我们怎样访问它们呢?我们可
以使用限定修饰名字符qualified name notation ,格式如下
namespace_identifier::entity_name;
如在
Cplusplus_Primer_3E::Array<string> text;
IBM_Canada_Laboratory::Matrix mat;
Disney_Feature_Animation::Point origin( 5000, 5000 );
虽然Disney_Feature_Animation IBM_Canada_Laboratory 以及Cplusplus_Primer_3E 都能
够唯一地标识相应的名字空间,但是如果在程序中经常这样使用,则多少会有些麻烦,使
用名字空间标识符如P3E DFA 或IBM_CL 会更方便一些,但是它们表达的信息相对比较少,
同时也增加了名字冲突的可能性。为了提供有意义的名字空间标识符,同时程序员又能很方
便地访问在名字空间内定义的实体。C++提供了别名设施。