Я просто читал немного на них из http://www.cplusplus.com/doc/tutorial/namespaces/, и кажется, что структура способна к тому же самому? Или даже класс в этом отношении. Возможно, кто-то здесь может лучше определить то, что пространство имен, и как оно отличается от структуры/класса?
Пространства имен и типы классов не могут выполнять одни и те же функции. Пространства имен в основном используются для группирования типов и функций вместе, чтобы избежать конфликтов имен, в то время как типы классов содержат данные и операции, которые работают с этими данными.
Чтобы просто сгруппировать функции и объекты с помощью типов классов, вам нужно сделать их статическими:
struct X {
static void f();
};
Без static
вам нужно будет создать экземпляры типов классов, чтобы использовать их . Здесь гораздо лучше подходит пространство имен:
namespace X {
void f();
}
Еще одна важная вещь - использование
деклараций и директив:
namespace X {
void f();
void g();
}
void h() {
using X::f;
f(); // f() now visible in current scope
using namespace X;
f(); g(); // both visible
}
Для классов-типов просто не существует механизма, который позволял бы это.
Типы классов дают вам над пространствами имен то, что вы можете иметь несколько экземпляров с разным состоянием - если вам нужно, используйте тип класса.
В C ++ структура точно такая же, как и класс, за исключением того, что структуры по умолчанию являются общедоступными. Занятия частные. Поэтому всякий раз, когда вы хотите сгруппировать бесплатные функции вместе, используйте пространство имен. Если вы хотите сгруппировать данные и функции, используйте структуру / класс и, возможно, пространство имен вокруг всего этого.
Обратите внимание: если вы поместите свои функции в структуру, тогда вам понадобится экземпляр этой структуры, когда вы захотите вызвать эти функции, если они не являются статическими.
При создании собственной библиотеки обычно рекомендуется использовать пространство имен для всех экспортируемых функций и классов.
Таким образом, если кто-то включит вашу библиотеку, он не будет загрязнять свое пространство имен, и вероятность конфликта имен будет меньше.
Если это можно сделать с помощью пространства имен, используйте пространство имен.
Структура делает гораздо больше, чем определение области видимости. Она определяет тип.
Что ж, похоже, все на это идут, поэтому я добавлю свои аргументы.
Перво-наперво, пространство имен
и struct
- это совершенно разные звери: у них разный синтаксис и разная семантика.
Очевидное:
структура
вводит тип, который можно использовать в качестве аргумента шаблона
может быть распределено в нескольких файлах Синтаксически:
пространством имен ns = mylong :: name :: space;
и структура с typedef mylong :: name :: Space lilstruct;
Семантически:
только определяет область определения символов, которая позволяет группировать вместе объекты, которые работают вместе (классы и свободные функции) изолируя их от остального мира (конфликты имен). Как таковой он часто представляет собой логическую единицу работы в рамках проекта (для небольших проектов существует единое пространство имен). структура
или класс
определяет логическую привязку между данными и методами, которые с ними действуют, что является краеугольным камнем инкапсуляции. Обычно у него есть одна четкая ответственность и несколько инвариантов. Обратите внимание, что иногда struct
или класс
просто используется для связывания вместе объектов, которые работают вместе без какой-либо логики, например struct Person {std :: string name , имя; };
.
При этом: в C ++ нет смысла использовать struct
из статических
методов. Это просто извращение Java или C # и их "чистого" объектно-ориентированного подхода. C ++ поддерживает бесплатные функции, поэтому нет смысла не использовать их, тем более что он лучше для инкапсуляции (у них нет доступа к частным / защищенным частям, поэтому вы не можете испортить инвариант, и они не зависят от представление класса тоже).