C ++标头和命名空间

时间:2016-12-13 22:47:37

标签: c++ namespaces

我的教授在大学告诉我们的内容与我在Stroustrup的书中所读到的内容之间存在一些混淆。

  • 我们都知道C ++ header基本上是一个集合 声明(在file.h中定义),它们可以包含例如a 课程集。它们非常有用,因为它们给了我们一个 存储在单个空间中的许多功能

  • 命名空间是为了组织类,函数而发明的, 在没有定义类型的情况下,在程序的一部分中键入(...)。

当我必须创建一个项目时,我无法看到具体的区别。

如果我(例如)制作了一个解决不同程度方程的程序,我会把我需要的类放在一个文件中。例如,我将把equations.h放在所有这些东西中:class secondDeg,class thirdDeg,class fourthDeg等等。

为什么我应该使用命名空间呢?

答案(我猜)是:因为你可以给一个更好的组织命名(参见std :: cin)。但在这种情况下我应该

  1. 创建equation.h(或其他)
  2. 创建一个名为eq的命名空间,例如
  3. 将我的课程放在命名空间
  4. 这真的很难吗?我不能只使用头文件并将我的所有类放在里面吗?

3 个答案:

答案 0 :(得分:7)

  

为什么我应该使用命名空间呢?

命名空间可以包含多个标题,例如,namespace std包含来自<vector> <list>等的定义。

您可以定义自己的namespace以免污染全局命名空间并避免冲突。最好将命名空间限制为所需的最小值,因此通常会避免使用using namespace std;

答案 1 :(得分:6)

  

这真的是必要的吗?

这取决于。更好,更明确的选择是将您的声明嵌入namespace

  

我不能只使用头文件并将所有类放在里面吗?

当然可以,只是避免与全局(::)范围内声明的符号发生任何冲突,并在头文件中避免使用using namespace <xxx>;

答案 2 :(得分:3)

您似乎在混淆两个截然不同的概念。标头是一个文件,通常用于包含声明。它可以包含函数声明,类,模板等。

命名空间是一种定义范围的方法,在该范围内声明的所有项都是唯一的。这允许您使用可能与标准中的名称冲突的函数和类名。例如

namespace mystuff
{
    class list { };
};

您的列表不会与std :: list冲突。

可以在头文件中使用命名空间和 来声明属于该命名空间的类。但是,正如其他人所指出的那样,不鼓励在头文件中使用'using'指令,因为它可以创建命名空间旨在解决的名称冲突。