C++ 命名空间

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,那么namespace_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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程