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