我是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 */
所以我的问题变成: 为什么使用“命名空间std {...}”,什么时候将类添加到命名空间是一种好习惯?
您必须了解什么是类和名称空间的基础知识。
类(以及struct,enum和enum类)用于在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。在名称空间块中,我们可以有更多的声明和定义。包括函数,类,结构等
不要以为命名空间保持打开状态,以后可以添加它们。例如,您可以拥有:
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之类的类,等等。
因此,回到您的问题,您要将类定义包装在名称空间中的原因是不污染全局名称空间。