C++语言导学 第三章 模块化 - 3.4 名字空间
3.4 名字空间
除了函数、类和枚举之外,C++还提供了一种称为名字空间(namespace)的机制,用来表达某些声明属于一个整体以及它们的名字不会与其他名字冲突。例如,我希望利用自己定义的复数类型进行实验:
namespace My_code{
class complex{
//...
};
complex sqrt(complex);
//...
int main();
}
int My_code::main()
{
complex z{1, 2};
auto z2 = sqrt(z);
std::cout<<‘{’<<z2.real()<<‘,’<<z2.imag()<<“}\n”;
//...
}
int main()
{
return My_code::main();
}
通过将我的代码放在名字空间My_code中,就可以确保我的名字不会与名字空间std中的标准库名字冲突。这种预防措施是明智的,因为标准库的确提供了complex算术运算。
访问另一个名字空间中的名字,最简单的方法是用名字空间的名字对其进行限定(例如std::cout和My_code::main)。“真正的main()”定义在全局名字空间中,换句话说,它不属于任何自定义的名字空间、类或者函数。
如果反复对一个名字进行限定变得令人乏味、分散注意力,我们可以使用using声明将名字引入作用域中:
void my_code(vector<int>& x, vector<int>& y)
{
using std::swap; //使用标准库swap
//...
swap(x, y); //std::swap()
other::swap(x, y); //其他某个swap()
//...
}
using声明令来自一个名字空间中的名字变得可用,就如同它声明在当前作用域中一样。我们使用using std::swap后,就像是已在my_code()中声明了swap一样。
为获取标准库名字空间中所有名字的访问权,我们可以使用using指示:
using namespace std;
using指示的作用是将具名名字空间中未限定的名字变得在当前作用域中可访问。因此,对std使用using指示之后,我们直接使用cout就可以了,无须再写std::cout。使用using指示后,我们就失去了选择性地使用名字空间中名字的能力,因此必须小心使用这一特性,通常是用在一个库遍布于应用中时(如std)或是在转换一个未使用namespace的应用时。
名字空间主要用于组织较大规模的程序组件,例如库。名字空间简化了用单独开发的组件组合程序的过程。