为什么要将类添加到命名空间中?——C++

3

我是一个c++的新手。

在Eclipse(配置了MinGW)和其他线程中,我注意到使用将类添加到命名空间中。

我提供一个示例来展示我的疑惑:

#ifndef MODEL_MANGO_HPP_
#define MODEL_MANGO_HPP_

namespace std {

class Mango {
public:
    Mango();
    virtual ~Mango();
};

} /* namespace std */

#endif /* MODEL_MANGO_HPP_ */
编辑:正如评论中所示,向命名空间std添加类是完全禁止的。引用@owacoder的话:

命名空间从不关闭,因此您始终可以向其中添加类定义。但是,按照规范,应将std命名空间视为关闭。

为了让您完整地了解上下文,这里是Eclipse为我默认生成的Mango.cpp实现:

#include "Mango.hpp"
namespace std {
Mango::Mango() {
    // TODO Auto-generated constructor stub
}
Mango::~Mango() {
    // TODO Auto-generated destructor stub
}
} /* namespace std */

所以我的问题变成了: 为什么要使用 "namespace std {...}",何时在命名空间中添加类是一个好的实践?

9
我不知道为什么要这样做,但我可以告诉你这违反了规格说明。 - undefined
3
命名空间永远不会关闭,因此您始终可以向其添加类定义。然而,根据规范,std 命名空间被视为已关闭。 - undefined
10
- undefined
3
如果你认识那样做的人,请告诉他们这不符合标准。但是也许你误解了,他们可能是在自己的名称空间中添加了“Mango”,而在另一个上下文中使用了“std”? - undefined
2
如果您正在使用类向导添加类,请确保命名空间字段不是标准的std。检查一下这个例子。 - undefined
显示剩余4条评论
1个回答

6
你需要了解类和命名空间的基本概念。
在C++中,类(结构体、枚举和枚举类)用于定义用户自定义类型。
你创建一个类来表示一个逻辑实体并封装细节等。
命名空间是一种标记代码区域和为变量限定唯一名称的方法。
如果你只在文件中编写一个类,它将被写入“全局命名空间”,这不是好的编程习惯,因为你会“污染命名空间”。
相反,你应该使用命名空间来限制变量名称有意义的范围。这样,你就不会很快耗尽合理的类和变量名称池(你有多少次想要编写一个“Utility”类?)
namespace firstNamespace{
int x=2;
}

namespace secondNamespace{
int x=7;
}

int main () 
{
std::cout << firstNamespace::x << '\n';
std::cout << secondNamespace::x << '\n';
return 0;
}

在本例中,您可以看到我们可以通过限定命名空间来在不同的上下文中“重用”变量名称x。在命名空间块内部,我们可以有更多的声明和定义,包括函数、类、结构体等等。
请注意,命名空间保持开放状态,您可以随时添加内容。例如,您可以有以下内容:
namespace firstNamespace{
int x=2;
}

namespace secondNamespace{
int x=7;
}

namespace firstNamespace{
int y=11;
}

在这里,我们添加了 firstNamespace::y。

更重要的是,您可以观察到 std 是由 C++ 提供的一个命名空间,其中包含许多有用的变量、对象(如类型为 std::ostream 的 cout)、函数和类,如 std::vector、std::ostream 等。

所以回到您的问题,将类定义包装在命名空间中的原因是不污染全局命名空间。


没问题,这只是一个关于为什么污染命名空间不好的简短解释。你应该真正了解命名空间以及它们的工作方式(包括使用等)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接