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)
对于类类型,根本没有允许它的机制.
什么类类型为您提供了名称空间,您可以拥有多个具有不同状态的实例 - 如果您需要使用类类型.
好吧,似乎每个人都在努力,所以我会添加自己的论点.
首先第一件事情,namespace并且struct是完全不同的东西:它们有不同的语法和语义.
显而易见的:
struct引入一个类型,可以用作模板参数namespace可以分布在几个文件中在语法:
namespace ns = mylong::name::space;和结构typedef mylong::name::Space lilstruct;语义:
namespace只定义符号定义的范围,它允许将一起工作的对象(类和自由函数)组合在一起,同时将它们隔离到世界其他地方(名称冲突).因此,它通常代表项目中的逻辑工作单元(对于小项目,只有一个命名空间).struct或class定义数据与作用于它的方法之间的逻辑绑定,这是封装的基石.它通常有一个明确的责任和一些不变量.注意,例如,有时a struct或class仅用于将没有任何逻辑的一起工作的对象绑定在一起struct Person { std::string name, firstName; };.
话虽如此:C++中struct的static方法没有意义.这只是来自Java或C#的反转以及他们的"纯粹"OO方法.C++支持自由函数,所以没有必要不使用它们,特别是因为它更适合封装(它们无法访问私有/受保护的部分,所以你不能搞乱一个不变量而且它们不依赖于该类的代表).
如果您不希望人们在您的类中使用 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)
这些当然应该位于命名空间中。命名空间名称很长,并且没有提供任何信息,可能更多地与维护它的人的组织有关 - 这很好......但实际上它应该是一个命名空间......而不是一个结构。