Чтобы добавить к превосходному ответу Питера, еще одним преимуществом пространств имен является то, что вы можете пересылать объявления, которые вы помещаете в пространство имен где-то еще, особенно структуры ...
//Header a.h
// Lots of big header files, spreading throughout your code
class foo
{
struct bar {/* ... */);
};
//header b.h
#include a.h // Required, no way around it, pulls in big headers
class b
{
//...
DoSomething(foo::bar);
};
И с пространствами имен ...
//Header a.h
// Big header files
namespace foo
{
struct bar {/* ... */);
}
//header b.h
// Avoid include, instead forward declare
// (can put forward declares in a _fwd.h file)
namespace foo
{
struct bar;
}
class b
{
//...
// note that foo:bar must be passed by reference or pointer
void DoSomething(const foo::bar & o);
};
Форвардные объявления имеют большое значение для времени компиляции после небольших изменений заголовка, когда вы получите проект, охватывающий сотни исходных файлов.
Редактировать из paercebal
Ответ был слишком хорош, чтобы позволить ему умереть из-за ошибки перечисления (см. Комментарии). Я заменил перечисления (которые могут быть объявлены заранее только в C ++ 0x, но не в сегодняшнем C ++) структурами.