C++ 将类添加到命名空间 : why?

标签 c++ namespaces

我是 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,

Namespaces are never closed, so you always have the ability to add class definitions to them. However, by the specification the std namespace is to be considered closed.

为了向您提供上下文的完整 View ,这里是 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 {...}”,什么时候向命名空间添加类是一个好习惯?

最佳答案

您必须了解什么是类和命名空间的基础知识。

类(以及结构、枚举和枚举类)用于在 C++ 中定义用户定义的类型。

您创建一个类来表示一个逻辑实体并封装细节等。

命名空间是一种标记代码区域和限定变量唯一名称的方法。

如果你只是在文件中写一个类,它将被写在“全局命名空间”中,这不是好的做法,因为你正在“污染命名空间”。

相反,您应该使用命名空间来限制您的变量名有意义的范围。这样,您就不会很快耗尽合理的类名和变量名(您想编写“实用程序”类多少次?)

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。在命名空间 block 中,我们可以有更多的声明和定义。包括函数、类、结构等。

不要让命名空间保持打开状态,您可以稍后添加它们。 例如你可以这样:

namespace firstNamespace{
int x=2;
}

namespace secondNamespace{
int x=7;
}

namespace firstNamespace{
int y=11;
}

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

更重要的是,你可以观察到 std 是 C++ 提供的一个命名空间,它包含很多有用的变量,像 cout 这样的 std::ostream 类型的对象,函数和类像 std::vector, std::ostream,等等

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

关于C++ 将类添加到命名空间 : why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34313969/

相关文章:

c++ - qualified::toplevel_namespace 和 unqualified toplevel_namespace 之间有什么区别吗?

c++ - 如何使用 CURL 登录网站

c++ - 如何将模板函数作为模板类参数传递?

c++ - 将类型分配给 typename 关键字

java - 使用命名空间但没有前缀的 JAXB 解码

C++ 不使用 使用

c++ - 在 mingw64 上使用 boost.thread 未定义对 InterlockedCompareExchange 的引用(但在 mingw32 上不存在)

c++ - 如何将二维数组值与用户输入进行比较?

python - 在 Python 中,赋值运算符在类方法定义中作为默认值传递时是否访问类或实例变量?

python - 带有子模块导入的命名空间