命名空间

命名空间允许将类、对象和函数等实体按照名称进行分组。 这样,全局范围可以划分为“子范围”,每个子范围都有自己的名称。

命名空间的格式为

namespace 标识符
{
实体
}

其中标识符是任何有效的标识符,实体是包含在命名空间内的类、对象和函数的集合。 例如

1
2
3
4
namespace myNamespace
{
  int a, b;
}

在这种情况下,变量a和 b是在名为myNamespace的命名空间中声明的普通变量。为了从myNamespace命名空间外部访问这些变量,我们必须使用作用域运算符::。例如,要从外部访问之前的变量myNamespace我们可以写

1
2
myNamespace::a
myNamespace::b

命名空间的功能在全局对象或函数可能使用与另一个对象或函数相同的标识符时特别有用,这会导致重定义错误。 例如

// namespaces
#include <iostream>
using namespace std;

namespace first
{
  int var = 5;
}

namespace second
{
  double var = 3.1416;
}

int main () {
  cout << first::var << endl;
  cout << second::var << endl;
  return 0;
}
5
3.1416

在这种情况下,有两个同名的全局变量var。 一个定义在命名空间first中,另一个定义在second中。由于命名空间,不会发生重定义错误。

using

关键字using用于将命名空间中的名称引入到当前声明区域。例如

// using
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
  int y = 10;
}

namespace second
{
  double x = 3.1416;
  double y = 2.7183;
}

int main () {
  using first::x;
  using second::y;
  cout << x << endl;
  cout << y << endl;
  cout << first::y << endl;
  cout << second::x << endl;
  return 0;
}
5
2.7183
10
3.1416

请注意在此代码中,x(没有任何名称限定符)指的是first::xy指的是second::y,完全符合我们的using声明。 我们仍然可以使用first::y的完整限定名。

using 关键字也可以用作指令来引入整个命名空间

// using
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
  int y = 10;
}

namespace second
{
  double x = 3.1416;
  double y = 2.7183;
}

int main () {
  using namespace first;
  cout << x << endl;
  cout << y << endl;
  cout << second::x << endl;
  cout << second::y << endl;
  return 0;
}
5
10
3.1416
2.7183

在这种情况下,因为我们声明了我们正在using namespace first,所以所有直接使用xy而没有名称限定符的都指的是namespace first.

using中的声明仅在声明它们的同一块中有效,或者如果在全局范围内直接使用它们,则在整个代码中有效。 例如,如果我们打算首先使用一个命名空间的对象,然后再使用另一个命名空间的对象,我们可以这样做

// using namespace example
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
}

namespace second
{
  double x = 3.1416;
}

int main () {
  {
    using namespace first;
    cout << x << endl;
  }
  {
    using namespace second;
    cout << x << endl;
  }
  return 0;
}
5
3.1416

命名空间别名


我们可以按照以下格式声明现有命名空间的备用名称

namespace new_name = current_name;

命名空间 std

C++ 标准库中的所有文件都在std命名空间中声明了其所有实体。 这就是为什么我们通常在所有使用using namespace std;语句的程序中包含iostream.
Index
目录