C++ C++;标题和名称空间

C++ C++;标题和名称空间,c++,namespaces,C++,Namespaces,我在大学里的教授告诉我们的和我在斯特劳斯塔普的书中读到的有些混淆 >我们都知道,C++ 标题基本上是一个集合 声明(在文件.h中定义),它们可以包含 类的集合。它们非常有用,因为它们给了我们 存储在单个空间中的许多功能 名称空间是用来组织类、函数、, 在程序的一部分中输入(…),而不定义类型 当我必须创建一个项目时,我看不到这里的具体区别 例如,如果我要制作一个程序来求解不同程度的方程,我会把我需要的类放在一个文件中。例如,我将把所有这些东西放入等式.h中:第二度、第三度、第四度等等 那

我在大学里的教授告诉我们的和我在斯特劳斯塔普的书中读到的有些混淆

    <> >我们都知道,C++ <代码>标题基本上是一个集合 声明(在文件.h中定义),它们可以包含 类的集合。它们非常有用,因为它们给了我们 存储在单个空间中的许多功能

  • 名称空间是用来组织类、函数、, 在程序的一部分中输入(…),而不定义类型

当我必须创建一个项目时,我看不到这里的具体区别


例如,如果我要制作一个程序来求解不同程度的方程,我会把我需要的类放在一个文件中。例如,我将把所有这些东西放入
等式.h
中:第二度、第三度、第四度等等

那么我为什么要使用名称空间呢

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

  • 创建方程式.h(或其他)
  • 例如,创建一个名为
    eq
    的命名空间
  • 将我的类放在名称空间中
  • 这真的有必要吗?我不能只使用头文件并将所有类放入其中吗

    这真的有必要吗

    视情况而定。更好、更清晰的选择是将声明嵌入
    名称空间

    我不能只使用头文件并将所有类放入其中吗

    当然可以,只需避免与全局(
    )范围中声明的符号发生任何冲突,并避免使用命名空间

    这真的有必要吗

    视情况而定。更好、更清晰的选择是将声明嵌入
    名称空间

    我不能只使用头文件并将所有类放入其中吗

    当然可以,只需避免与全局(
    )范围中声明的符号发生任何冲突,并避免使用命名空间

    那么我为什么要使用名称空间呢

    一个名称空间可以包含多个标题,例如,
    namespace std
    包含来自
    等的定义

    您可以定义自己的
    命名空间
    ,以避免污染全局命名空间并避免冲突。将名称空间限制到您所需的最小值是一种良好的做法,因此
    使用名称空间std

    那么我为什么要使用名称空间呢

    一个名称空间可以包含多个标题,例如,
    namespace std
    包含来自
    等的定义


    您可以定义自己的
    命名空间
    ,以避免污染全局命名空间并避免冲突。将名称空间限制到您所需的最小值是一种良好的做法,因此
    使用名称空间std

    您似乎将两个不同的概念混为一谈。头文件是一个文件,通常用于包含声明。它可以包含函数声明、类、模板等

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

    namespace mystuff
    {
        class list { };
    };
    
    您的列表不会与std::list冲突


    名称空间可以而且应该在头文件中使用,以声明属于该名称空间的类。但是,正如其他人所指出的,不鼓励在头文件中使用“using”指令,因为它会产生名称空间要解决的名称冲突。

    您似乎将两个不同的概念混为一谈。头文件是一个文件,通常用于包含声明。它可以包含函数声明、类、模板等

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

    namespace mystuff
    {
        class list { };
    };
    
    您的列表不会与std::list冲突


    名称空间可以而且应该在头文件中使用,以声明属于该名称空间的类。但是,正如其他人所指出的,不鼓励在头文件中使用“using”指令,因为它会产生名称空间要解决的名称冲突。

    那么名称空间就像java包一样吗?@RaffaeleRossi不知怎么说,是的。好的,非常有帮助,我想我已经解决了。您建议不要在标题中使用名称空间,以避免与全局范围中的符号冲突?@RaffaeleRossi是的,永远不要使用
    使用名称空间xx在头文件中,这可能会造成伤害!而是显式地使用名称空间范围,根据需要使用前缀
    std:
    eq::
    。在翻译单元中,您可以使用
    语句来提取,但在头文件中,这是一个非常糟糕的主意,而且容易出错。所以名称空间有点像java包吗?@RaffaeleRossi,不知怎的,是的。好的,非常有帮助,我想我已经弄明白了。您建议不要在标题中使用名称空间,以避免与全局范围中的符号冲突?@RaffaeleRossi是的,永远不要使用
    使用名称空间xx在头文件中,这可能会造成伤害!而是显式地使用名称空间范围,根据需要使用前缀
    std:
    eq::
    。在翻译单元中,你可以使用
    使用
    语句来拾取,但在头文件中,这是一个非常糟糕的主意,而且容易出错。这正是我需要的答案,我现在真的得到了区别。在您的示例中,您可以调用mystuff::list,而不必使用标准库。非常感谢。这正是我需要的答案,我现在真的得到了不同。在您的示例中,您可以调用mystuff::list,而不必使用标准库。非常感谢。