我有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;
其他回答
我在其他答案中没有看到任何提及,所以这里是我的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.]
为了避免赘述,Mark Ingram已经说了一个使用名称空间的小技巧:
避免在头文件中使用“using namespace”指令——这会为导入该头文件的程序的所有部分打开命名空间。在实现文件(*.cpp)中,这通常不是大问题——尽管我更喜欢在函数级别上使用“using namespace”指令。
我认为命名空间主要用于避免命名冲突,而不一定用于组织代码结构。我主要用头文件/文件结构来组织c++程序。
有时在较大的c++项目中使用名称空间来隐藏实现细节。
using指令的附加说明: 有些人喜欢只对单个元素使用“using”:
using std::cout;
using std::endl;
我使用c++命名空间的方式与我在c#、Perl等中使用的方式相同。它只是标准库内容、第三方内容和我自己的代码之间的符号语义分离。我会将自己的应用程序放在一个名称空间中,然后将可重用的库组件放在另一个名称空间中进行分离。
java和c++的另一个区别是,在c++中,名称空间层次结构不需要调整文件系统布局。因此,我倾向于将整个可重用库放在一个单独的命名空间中,并将库中的子系统放在子目录中:
#include "lib/module1.h"
#include "lib/module2.h"
lib::class1 *v = new lib::class1();
如果存在名称冲突的可能性,我只会将子系统放在嵌套的名称空间中。