C++ 简单理解命名空间

92 阅读2分钟

大型程序会使用多个库,而每个库中又会定义大量的类,函数和模板。这些程序在同时使用这些库的时候,很有可能发生冲突!这就发生了命名空间污染

为了防止这种情况的发生,一些程序员会将其定义的全局实体名字弄的很长。 比如:

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);