C++ 命名空间
-
命名空间
考虑一种情况,当我们在同一个班级中有两个同名Zara的人时。每当我们绝对需要区分它们时,我们都必须使用一些其他信息以及他们的姓名,例如,如果他们居住在不同地区,或者他们母亲或父亲的名字,等等。在您的C++应用程序中可能会出现相同的情况。例如,您可能正在编写一些具有称为xyz()函数的代码,并且还有另一个库也具有相同的函数xyz()。现在,编译器无法知道您在代码中所引用的xyz()函数的版本。命名空间的目的是克服这个困难,并作为额外的信息来区分类似的函数,类,变量等在不同库中可用相同的名称。使用命名空间,可以定义定义命名空间的上下文。本质上,命名空间定义范围。 -
定义命名空间
命名空间定义以关键字namespace开头,后跟命名空间名称,如下所示:namespace namespace_name { // code declarations }
要调用功能或变量的启用命名空间的版本,请在命名空间名称前添加(::),如下所示:-name::code; // code could be variable or function.
让我们看看命名空间如何限制包括变量和函数在内的实体-
尝试一下#include <iostream> 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指令
您还可以使用using namespace指令在命名空间前避免添加前缀。该指令告诉编译器,后续代码正在使用指定命名空间中的名称。因此,以下代码隐含了命名空间-
尝试一下#include <iostream> 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 <iostream> 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 <iostream> 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