我有Java背景,使用的是包,而不是名称空间。我习惯于将一起工作以形成完整对象的类放入包中,然后从该包中重用它们。但是现在我在用c++工作。
在c++中如何使用名称空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是,如何从其他名称空间中的类创建对象?
我有Java背景,使用的是包,而不是名称空间。我习惯于将一起工作以形成完整对象的类放入包中,然后从该包中重用它们。但是现在我在用c++工作。
在c++中如何使用名称空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是,如何从其他名称空间中的类创建对象?
当前回答
我在其他答案中没有看到任何提及,所以这里是我的2美分:
在“使用名称空间”主题上,一个有用的语句是名称空间别名,允许您“重命名”名称空间,通常是给它一个更短的名称。例如,不要:
Some::Impossibly::Annoyingly::Long:Name::For::Namespace::Finally::TheClassName foo;
Some::Impossibly::Annoyingly::Long:Name::For::Namespace::Finally::AnotherClassName bar;
你可以这样写:
namespace Shorter = Some::Impossibly::Annoyingly::Long:Name::For::Namespace::Finally;
Shorter::TheClassName foo;
Shorter::AnotherClassName bar;
其他回答
@marius
是的,你可以同时使用几个命名空间,例如:
using namespace boost;
using namespace std;
shared_ptr<int> p(new int(1)); // shared_ptr belongs to boost
cout << "cout belongs to std::" << endl; // cout and endl are in std
[2014年2月-(真的有那么长时间吗?):正如乔伊在下面指出的,这个特殊的例子现在是模棱两可的。Boost和std::现在各有一个shared_ptr.]
我更喜欢为应用程序使用顶级名称空间,而为组件使用子名称空间。
使用来自其他名称空间的类的方式与java中的方式惊人地相似。 你可以使用“use NAMESPACE”,这类似于“import PACKAGE”语句,例如使用std。或者你指定包作为类的前缀,用“::”分隔,例如std::string。这类似于“java.lang”。字符串”。
我所见过的大型c++项目很少使用一个以上的命名空间(例如boost库)。
实际上boost使用了大量的名称空间,通常boost的每个部分都有自己的内部工作空间,然后可能只将公共接口放在顶级名称空间boost中。
我个人认为,代码库越大,名称空间就越重要,即使在单个应用程序(或库)中也是如此。在工作中,我们将应用程序的每个模块放在自己的命名空间中。
我经常使用的命名空间的另一种用法(不是双关语)是匿名命名空间:
namespace {
const int CONSTANT = 42;
}
这基本等同于:
static const int CONSTANT = 42;
然而,使用匿名命名空间(而不是静态命名空间)是在c++中仅在当前编译单元中可见的代码和数据的推荐方式。
一般来说,如果我认为一段代码可能与其他库有函数或类型名称冲突,我会为它创建一个名称空间。它也有助于品牌代码,ala boost::。
性病::cout
的 前缀std::表示 名称cout和endl是 在命名空间内定义 命名std。允许命名空间 我们要避免无意的碰撞 在我们定义的名称之间 以及使用这些相同的名字 在图书馆里。所有的名字 由标准库定义 都在stdnamespace中。写作std:: Cout使用作用域操作符 (运算符::)来表示我们 要使用名称cout 定义在 名称空间性病。 会显示一个更简单的方法 从库中访问名称。