C++将类添加到命名空间:原因

C++ adding class to a namespace: why?

本文关键字:命名空间 原因 添加 C++      更新时间:2023-10-16

我是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_ */

EDIT:如注释所示,完全禁止将类添加到命名空间std。引用@owacooder,

命名空间永远不会关闭,因此您始终可以添加类定义。然而,根据规范命名空间将被视为已关闭。

为了向您提供上下文的完整视图,以下是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{…}"?何时向命名空间中添加类是一种好的做法

您必须了解类和名称空间的基本知识。

类(以及structs、enum和enum类)用于在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::estream等)。

因此,回到您的问题,您希望将类定义封装在名称空间中的原因是为了不污染全局名称空间。