大型程序会使用多个库,而每个库中又会定义大量的类,函数和模板。这些程序在同时使用这些库的时候,很有可能发生冲突!这就发生了命名空间污染。
为了防止这种情况的发生,一些程序员会将其定义的全局实体名字弄的很长。 比如:
class my_only_cplusplus_class{};
vector<int> my_special_cplusplus_vector(1);
实际上,读写这些代码是十分难受的。
命名空间为防止名字冲突提供了更可控的机制。 命名空间分割了全局命名空间,其中每个命名空间是一个作用域。 这样,程序员就可以避免全局名字固有的限制。
命名空间定义
命名空间定义包括两部分:
首先是关键字namespace,随后是命名空间的名字。 譬如:
namespace mycode{
class person{};
vector<int> v;
string s="";
string t="temp"
}//命名空间结束后无需分号
每个命名空间都是一个作用域
命名空间中每个名字都表示该空间内的唯一实体
mycode::s=mycode::t;
命名空间是可以不连续的
命名空间可以定义在不同的部分
namespace mycode{
//////////////////////
}
这也许是定义了一个新的名为mycode的命名空间,也可能是为已经存在的命名空间添加一些新的成员。
使用命名空间成员
我们直接使用
命名空间::成员名
这样显得十分的繁琐,我们可以使用一些更为便捷的方法
即是using声明和using指示
一条using声明语句一次只引入命名空间的一个成员。它使得我们可以清楚的知道程序中所用的到底是哪个名字
using mycode::s;
s="Hello World!";
mycode::v.push(1);
using指示和using声明类似的地方是,我们可以用命名空间的简写形式;但是using指示的所有名字都是可见的。
using指示可以出现在全局作用域、局部作用域和命名空间作用域中,但是不能出现在类的作用域中。
using namespace mycode;
s="Hello cpp";
v.push(2);