为什么要使用名称空间?

Why are namespaces used?

这让我很困惑。所有 namespaceAnamespaceB 的代码示例以及 foo()bar() 的方法名称也无济于事。每个人解释它的方式使它看起来好像名称空间是 pre-OOP 时代的遗物,你不能说 'class car give fuel level' 但必须从另一种方法来解决这个问题。但是当我现在想做一个C++级别的时候,使用命名空间有什么意义呢?并不是说 header 已经足够令人困惑了,命名空间对我来说完全没有意义,无论是它们如何工作还是为什么要使用它们。

例如,假设我有一个围绕 Traffic 构建的项目。对于 Car 及其组成部分、DriverPassenger 以及 Road,您会有 类。 现在,RoadCar,每个 CarPerson。这会是什么样子?

你有命名空间 RoadCarPerson 吗? main() 会使用命名空间 Road 来访问 header 中的内容吗?命名空间 Road 是否包含命名空间 Car,而 Car 是否包含命名空间 Person,并且 main() 是否可以通过此方式访问 Person?这是大多数指南解释这一点的方式,但我并没有真正看到它比仅导入 header 文件有什么优势,难道不会有同样的效果吗?

或者你会把多个 header 放在同一个命名空间中,比如 namespace Traffic 和所有那些 类?可以嵌套命名空间吗?

我知道 C# 并且一直不知道它有命名空间,直到我刚才查找它,并且从来不需要它,在 Java、Python 和 Dart 中,这些也从未出现过。由于我正在尝试自学 C++,所以我现在有点被困在这里,在这里问这个问题。到目前为止,我也从未在C++中使用过它们,但我想好好学习一下。

对于小型 self-contained 项目,命名空间的需求并不大,您永远不会为代码中的每个对象或概念创建命名空间。

使用库的大型项目受益于与这些库引入的名称隔离,以及一些内部组织以提高可读性。

同样,在创建 库时,最好将其内容放入命名空间,以免给用户带来麻烦和冲突(因为您不知道他们的项目有多大,以及他们自己可能想使用什么名称)。

打个比方:如果你有三本书,你不会费心按字母顺序排列它们。但是,一旦你有一百个,你可能会决定将它们分类放在你的书架上,以便于参考和心理健康。

而且,如果您现在从朋友那里再借 20 本书,您可能会将它们单独放在一堆,以便在需要归还时更容易找到。

所以,在某种程度上,这是一个……你会知道为什么需要它,什么时候需要它。

"[Named] Namespaces",顾名思义,是 细分 标识符 space 的一种方式。除了解决字面冲突(“你有不止一个 foo ...”),它还使得 find foo 变得相当容易,成熟的程序很可能包含数百甚至数千个模块。

变量或例程的“名称”可能(?)暗示它是什么,但可能不会提供任何关于哪里[=22]的线索=] 它是,也不是它所涉及的 context(不是技术术语):“它只是成千上万个名字中的一个。”但是,如果您现在将它们分组到 intelligently-chosen 名称space 中,您将向它们添加一个有用的 organization 级别。在一个典型的“伟大的大程序”中,尤其是(这也是典型的......)“你并不完全熟悉”,这个额外的 bread-crumbs 级别是一个很大的好处。

简单地说,命名空间允许在不同的上下文中使用相同的名称。

假设您要创建两个采用相同参数并以两种不同方式输出文本的函数,为了简单起见,您希望将它们都称为 print().

因为它们都采用相同的参数,所以这里没有函数重载的机会,但是如果你把每个函数放在一个单独的命名空间中然后你调用 print(),你可以简单地改变函数将要重载的内容每次都调用不同的命名空间。

如果我制作了一个包含函数 calculateStuff() 的库,而你也制作了一个包含 calculateStuff() 函数的库,那么其他人想要同时使用我们的两个库将有一个糟糕的一天。但是,如果我们都使用名称空间就没有问题,因为 he/she 可以将函数区分为 myNamespace::calculateStuff()yourNamespace::calculateStuff(),并且没有歧义。

例如:std::shared_ptrboost::shared_ptr。如果没有名称空间,您将无法在同一个程序中同时使用两者,因为名称 shared_ptr 会产生歧义。