命名空间
命名空间允许将类、对象和函数等实体按照名称进行分组。 这样,全局范围可以划分为“子范围”,每个子范围都有自己的名称。
命名空间的格式为
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::x而
y指的是
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,所以所有直接使用
x和
y而没有名称限定符的都指的是
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.