📅  最后修改于: 2020-12-17 05:15:22             🧑  作者: Mango
考虑一种情况,当我们有两个人在同一个班上使用相同的名字Zara。每当我们绝对需要区分他们时,我们都必须使用一些其他信息以及他们的名字,例如该地区(如果他们居住在不同地区)或他们的母亲或父亲的名字等。
您的C++应用程序中可能会出现相同的情况。例如,您可能正在编写一些具有称为xyz()函数的代码,并且还有另一个库也具有相同的函数xyz()。现在,编译器无法知道您在代码中所引用的xyz()函数的版本。
设计名称空间是为了克服这一困难,它被用作附加信息来区分具有不同库中可用的相同名称的相似函数,类,变量等。使用名称空间,可以定义定义名称的上下文。本质上,名称空间定义范围。
命名空间定义以关键字命名空间开头,后跟命名空间名称,如下所示:
namespace namespace_name {
// code declarations
}
要调用函数或变量的启用名称空间的版本,请在名称空间名称前添加(::),如下所示:
name::code; // code could be variable or function.
让我们看看命名空间如何限制包括变量和函数在内的实体-
#include
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
int main () {
// Calls function from first name space.
first_space::func();
// Calls function from second name space.
second_space::func();
return 0;
}
如果我们编译并运行以上代码,这将产生以下结果-
Inside first_space
Inside second_space
您还可以避免使用using namespace指令在名称空间前添加前缀。该指令告诉编译器,后续代码正在使用指定名称空间中的名称。因此,以下代码隐含了名称空间-
#include
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main () {
// This calls function from first name space.
func();
return 0;
}
如果我们编译并运行以上代码,这将产生以下结果-
Inside first_space
‘using’指令还可用于引用命名空间中的特定项目。例如,如果您要使用的std名称空间的唯一部分是cout,则可以按以下方式引用它:
using std::cout;
后续代码可以在不添加名称空间的情况下引用cout,但是std名称空间中的其他项仍需要如下显式-
#include
using std::cout;
int main () {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
如果我们编译并运行以上代码,这将产生以下结果-
std::endl is used with std!
using指令中引入的名称遵循正常的作用域规则。从using指令的点到找到该指令的作用域的结尾,该名称都是可见的。隐藏在外部作用域中具有相同名称的实体。
可以将命名空间分为几部分来定义,因此命名空间由其单独定义的部分之和组成。命名空间的各个部分可以分布在多个文件中。
因此,如果命名空间的一部分需要在另一个文件中定义的名称,则仍必须声明该名称。编写以下命名空间定义,或者定义新的命名空间,或者将新元素添加到现有的命名空间中-
namespace namespace_name {
// code declarations
}
可以嵌套命名空间,您可以在其中定义另一个命名空间中的一个命名空间,如下所示:
namespace namespace_name1 {
// code declarations
namespace namespace_name2 {
// code declarations
}
}
您可以通过使用解析运算符来访问嵌套名称空间的成员,如下所示:
// to access members of namespace_name2
using namespace namespace_name1::namespace_name2;
// to access members of namespace:name1
using namespace namespace_name1;
在上述语句中,如果您使用namespace_name1,则它将使scope_name2的元素在范围内可用,如下所示:
#include
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main () {
// This calls function from second name space.
func();
return 0;
}
如果我们编译并运行以上代码,这将产生以下结果-
Inside second_space