命名空间真的不适合的功能范畴,但他们认为我们需要覆盖在我们得到的类和面向对象编程的一个重要概念,这真的是一个理想的地方。
假装你是一个课堂上学生的老师。为例,假设有两个男孩取名为“亚历克斯”。如果你说,“亚历克斯有一个他的测试”,亚历克斯你是指?没有人知道,除非你有办法消除歧义,亚历克斯你的意思。也许你点一,或使用他们的姓。如果两个亚历克斯在不同的教室,不会有问题,真正的问题是,有在同一个地方两个具有相同名称的东西。事实上,作为课堂教学中提高学生的数量,可能有两个相同的学生成倍增加的第一名。
类似的问题可以在编程时出现的两个标识符(变量或函数名)具有相同的名称,被引入到相同的范围内。当这种情况发生时,就会产生一个命名冲突,而编译器将产生一个错误,因为它没有足够的信息来解决歧义。随着程序越来越大,标识符的数量呈线性增加,这反过来又导致命名冲突成倍增加的概率。
让我们来看看一个命名冲突例一看。在下面的例子中,foo。H和咕。h头文件包含的功能,做不同的事情,但具有相同的名称和参数。
1
2
3
4
5
|
// This DoSomething() adds it's parameters
int
DoSomething(
int
nX,
int
nY)
{
return
nX + nY;
}
|
goo.h:
1
2
3
4
5
|
// This DoSomething() subtracts it's parameters
int
DoSomething(
int
nX,
int
nY)
{
return
nX - nY;
}
|
main.cpp:
1
2
3
4
5
6
7
8
9
10
|
#include <foo.h>
#include <goo.h>
#include <iostream>
int
main()
{
using
namespace
std;
cout << DoSomething(4, 3);
// which DoSomething will we get?
return
0;
}
|
如果foo。H和咕。h分别编译,他们将分别编译没有事件。然而,在相同的程序,包括他们,我们已经介绍了两个不同的函数具有相同的名称和参数的程序,使一个命名冲突。作为一个结果,编译器将发出一个错误:
C:\\ vcprojects \\咕。H(4):误差函数c2084:“int __cdecldoSomething(int,int)”已经有一个身体
为了帮助解决这种类型的问题,介绍了命名空间的概念。
命名空间是什么?
一个命名空间定义的代码区域中的所有标识符必须是唯一的。默认情况下,所有的变量和函数定义在全局命名空间。例如,在下面的代码片段一看:
1
2
3
4
5
|
int
nX = 5;
int
foo(
int
nX)
{
return
-nX;
}
|
两个NX和foo()在全局命名空间中定义。
在示例程序,上面有命名冲突,当main() #包括foo。H和咕。H,编译器试图把()两个版本为全局命名空间,这就是为什么命名冲突导致。
为了避免问题在两个独立的代码已经命名冲突与彼此一起使用时,C + +允许我们宣告自己的命名空间的命名空间关键词。任何在用户定义的命名空间声明属于命名空间,而不是全局命名空间。
这是第一个例子的标头实例改写使用命名空间: