我有Java背景,使用的是包,而不是名称空间。我习惯于将一起工作以形成完整对象的类放入包中,然后从该包中重用它们。但是现在我在用c++工作。

在c++中如何使用名称空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是,如何从其他名称空间中的类创建对象?


当前回答

命名空间本质上是包。它们可以这样使用:

namespace MyNamespace
{
  class MyClass
  {
  };
}

然后在代码中:

MyNamespace::MyClass* pClass = new MyNamespace::MyClass();

或者,如果你想总是使用一个特定的名称空间,你可以这样做:

using namespace MyNamespace;

MyClass* pClass = new MyClass();

编辑:按照bernhardrusch所说,我倾向于不使用“使用名称空间x”语法,我通常在实例化对象时显式指定名称空间(即我展示的第一个示例)。

正如下面所要求的,您可以使用任意数量的名称空间。

其他回答

我更喜欢为应用程序使用顶级名称空间,而为组件使用子名称空间。

使用来自其他名称空间的类的方式与java中的方式惊人地相似。 你可以使用“use NAMESPACE”,这类似于“import PACKAGE”语句,例如使用std。或者你指定包作为类的前缀,用“::”分隔,例如std::string。这类似于“java.lang”。字符串”。

命名空间本质上是包。它们可以这样使用:

namespace MyNamespace
{
  class MyClass
  {
  };
}

然后在代码中:

MyNamespace::MyClass* pClass = new MyNamespace::MyClass();

或者,如果你想总是使用一个特定的名称空间,你可以这样做:

using namespace MyNamespace;

MyClass* pClass = new MyClass();

编辑:按照bernhardrusch所说,我倾向于不使用“使用名称空间x”语法,我通常在实例化对象时显式指定名称空间(即我展示的第一个示例)。

正如下面所要求的,您可以使用任意数量的名称空间。

为了避免赘述,Mark Ingram已经说了一个使用名称空间的小技巧:

避免在头文件中使用“using namespace”指令——这会为导入该头文件的程序的所有部分打开命名空间。在实现文件(*.cpp)中,这通常不是大问题——尽管我更喜欢在函数级别上使用“using namespace”指令。

我认为命名空间主要用于避免命名冲突,而不一定用于组织代码结构。我主要用头文件/文件结构来组织c++程序。

有时在较大的c++项目中使用名称空间来隐藏实现细节。

using指令的附加说明: 有些人喜欢只对单个元素使用“using”:

using std::cout;  
using std::endl;

我使用c++命名空间的方式与我在c#、Perl等中使用的方式相同。它只是标准库内容、第三方内容和我自己的代码之间的符号语义分离。我会将自己的应用程序放在一个名称空间中,然后将可重用的库组件放在另一个名称空间中进行分离。

在Java中:

package somepackage;
class SomeClass {}

在c++中:

namespace somenamespace {
    class SomeClass {}
}

使用它们,Java:

import somepackage;

和c++:

using namespace somenamespace;

此外,全名是“somepackage”。用于Java的SomeClass和用于c++的somenamespace::SomeClass。使用这些约定,您可以像在Java中一样进行组织,包括为名称空间创建匹配的文件夹名称。但是没有文件夹->包和文件->类的要求,因此您可以根据包和名称空间独立地命名文件夹和类。