名字空间允许我们封装名字,否则的话,这些名字就有可能污染到全局的名字空间(pollute teh global namespce).一般来说,只有我们希望我们的代码被外部软件开发部门使用的时候。才会用到名字空间。
例如;我们可以这样来封装Array类,
namespace cplacple_primer_3E
{
template <calss eyemly>
calss Array{,,,,,,,,,};
////////////////////////
}
namespce后面的名字标明了一个名字空间。它独立于全局名字空间。我们可以在里面放一些希望声明在函数和类之外的实体。名字空间并不改变他们的声明意义。只是改变了它们的可视性。如果名字空间中的声明对于程序来说不是立即可见的。那么我们杂样来访问他们呢?我们就要用到限定修饰名字符.
格式如下:
namespce_idenerfier::entrityname
名字空间别名(namespce alias)允许用一个可替代的,短的,或者跟一般的名字来和名字空间来关联起来。
例如:
//提供一个更一般化的名字
namespce lib=cplacple_primer_3E
然后这个名字就会称为原始名字空间的同义词。
#include "cplacple.h"
int main()
{
lib::Array{...........}
}
别名也可以 用来封装正在使用的实际的名字空间。在这种情况下,我们可以通过改变别名的名字空间。
来改变所使用的声明集。而无需改变“通过别名来访问这些声明”。的实际代码。
using 指示符使名字空间中的所有的声明都是可见得。这样这些声明可以不加任何的限定的使用。
using和namespce都是关键字。被引用的名字空间必须已经被声明了。否则的话,会引起编译的错误。
using 声明提供了更为精细的名字可视化机制。它允许使名字空间中的单个的声明可见。
例如:
#include"IBM_Canada_Labaraory.h"
using namespace IBM_Canada_Labaraory::Matriy
int main()
{
//ok; IBM_Canada_Labaraory::Matriy
Matriy met(4,5);
//fail,错误。IBM_Canada_Labaraory::Array不可见
Array array(4,5);
}
为了防止标准的c++库组件污染用户定义的名字空间。所有的c++库组件都声明在一个称为std的名字空间中。
所以即使我们在我们的文本文件中已经包含了c++库头文件,头文件中声明的内容在我们的文本文件中也是不可见的。
例如:
在c++中下面的代码是不能被编译通过的。
#include<string>
///错误。string 是不可见的
string current_string="asdf dfdff";
在string 头文件中所有的声明都包含在std名字空间中。
我们可以用“#include 指示符后面加上using 的办法使在<string>中的,在std中声明的组件,对于我们的文本文件是可见得。
例如:
#include<string>
using namespace std
int main()
{
//////////正确。string 是可见的。
string current_string="asd fdfdf"
}
为了使在std中,声明的组件和名字在我们的文本文件中可见。using指示符通常被看作是一种比较差的选择方案。
在上面的例子中。指示符using ,使在string头文件中声明的,并且在std名字空间中的 组件在我们的文本文件中都是可见的。这又将全局名字空间污染问题带回来了。而这个问题就是std名字空间首先要努力避免的。
它增加了“c++标准库组件的名字”与“我们程序中声明的全局名字”冲突的机会。
现在有两种机制可以替代using指示符。来引用隐藏在std名字空间中的名字string.
第一种方法:
可以使用限定的名字。
#include<string>
/////正确。使用限定的名字
std:: string current_string="afdfdfsdfs";
第二种方法:
如下使用using 声明;
#include<string>
using std::string;
/////ok.上面的using声明使string可见。
string=“dfdfdfafsdf”;
为了使用名字空间中的声明的名字。最好使用带有精细选择功能的 using声明替代using 指示符。