何时使用命名空间或结构?

Jus*_*ten 11 c++ struct namespaces

我只是从http://www.cplusplus.com/doc/tutorial/namespaces/上阅读了一些内容 ,它看起来像一个结构体能够做同样的事情?或者甚至是一个类.也许有人可以更好地定义命名空间是什么,以及它与结构/类的区别?

Geo*_*che 18

命名空间和类类型不具备相同的功能.命名空间主要用于将类型和函数组合在一起以避免名称冲突,而类类型包含处理该数据的数据和操作.

要使用类类型对函数和对象进行分组,您必须将它们设置为静态:

struct X {
    static void f();
};
Run Code Online (Sandbox Code Playgroud)

没有static你必须创建类类型的实例来使用它们.命名空间在这里更适合:

namespace X {
    void f();
}
Run Code Online (Sandbox Code Playgroud)

另一个重要的事情是using声明和指令:

namespace X {
    void f();
    void g();
}

void h() {
    using X::f;
    f(); // f() now visible in current scope
    using namespace X;
    f(); g(); // both visible
}
Run Code Online (Sandbox Code Playgroud)

对于类类型,根本没有允许它的机制.

什么类类型为您提供了名称空间,您可以拥有多个具有不同状态的实例 - 如果您需要使用类类型.

  • 最重要的是,结构和名称空间用于解决不同的问题.因此,当您使用命名空间时,您会与使用结构时的其他内容进行通信. (5认同)

Mat*_* M. 7

好吧,似乎每个人都在努力,所以我会添加自己的论点.

首先第一件事情,namespace并且struct是完全不同的东西:它们有不同的语法和语义.

显而易见的:

  • a struct引入一个类型,可以用作模板参数
  • a namespace可以分布在几个文件中

在语法:

  • 两者都可以是"别名",命名空间namespace ns = mylong::name::space;和结构typedef mylong::name::Space lilstruct;
  • ADL(或Argument Dependent Lookup)是为命名空间量身定制的

语义:

  • a namespace只定义符号定义的范围,它允许将一起工作的对象(类和自由函数)组合在一起,同时将它们隔离到世界其他地方(名称冲突).因此,它通常代表项目中的逻辑工作单元(对于小项目,只有一个命名空间).
  • a structclass定义数据与作用于它的方法之间的逻辑绑定,这是封装的基石.它通常有一个明确的责任和一些不变量.

注意,例如,有时a structclass仅用于将没有任何逻辑的一起工作的对象绑定在一起struct Person { std::string name, firstName; };.

话虽如此:C++中structstatic方法没有意义.这只是来自Java或C#的反转以及他们的"纯粹"OO方法.C++支持自由函数,所以没有必要不使用它们,特别是因为它更适合封装(它们无法访问私有/受保护的部分,所以你不能搞乱一个不变量而且它们不依赖于该类的代表).

  • 这可能不是最佳答案,但这仍然是一个很好的答案。它确实解释了如何以及为什么。爱它! (2认同)

Eri*_*sty 5

如果您不希望人们在您的类中使用 C++ 的“using”功能(这可能很危险,并且在复杂代码中通常是不明智的),那么请继续使用带有静态的结构。

换句话说:如果您的函数应始终使用“group::function”来引用,那么您可以通过声明为结构体来限制您的用户。

此外,重要的是,您可以在旧版本的 C++ 中前向声明结构。 在 C++ 11 之前,您无法对命名空间执行此操作。

考虑:

std::string out zip::pack(const std::string &in)
std::string out zip::unpack(const std::string &in)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,要求用户指定 zip:: 是有意义的。它简短、具体且内容丰富。如果没有它,底层函数的名称就会不明确。使用带有静态的结构。

考虑:

std::string out CorpDataUtils::zipPack(const std::string &in)
std::string out CorpDataUtils::zipUnpack(const std::string &in)
Run Code Online (Sandbox Code Playgroud)

这些当然应该位于命名空间中。命名空间名称很长,并且没有提供任何信息,可能更多地与维护它的人的组织有关 - 这很好......但实际上它应该是一个命名空间......而不是一个结构。