По умолчанию используются функции пространства имен.
Классы предназначены для создания объектов, а не для замены пространств имен.
В объектно-ориентированном коде
Скотт Мейерс написал целую статью для своей книги Effective C ++ по этой теме: «Предпочитайте функции, не являющиеся членами, не являющимися друзьями, функциям-членам». Я нашел онлайн ссылку на этот принцип в статье Херба Саттера: http://www.gotw.ca/gotw/084.htm
Важно знать, что: В C ++ функции в том же пространстве имен, что и класс, принадлежат интерфейсу этого класса (поскольку ADL будет искать эти функции при разрешении вызовов функций ).
Функции пространства имен, если они не объявлены как «друг», не имеют доступа к внутренним объектам класса, тогда как статические методы имеют.
Это означает, например, что при ведении вашего класса, если вам нужно изменить внутренние компоненты вашего класса, вам нужно будет искать побочные эффекты во всех его методах, включая статические.
Расширение I
Добавление кода в интерфейс класса.
В C # вы можете добавлять методы в класс, даже если у вас нет к нему доступа. Но в C ++ это невозможно.
Но в C ++ вы все равно можете добавить функцию пространства имен даже в класс, который кто-то написал для вас.
С другой стороны, это важно при разработке вашего кода, потому что, помещая ваши функции в пространство имен, вы разрешаете своим пользователям расширять / дополнять интерфейс класса.
Расширение II
Побочным эффектом предыдущего пункта является невозможность объявления статических методов в нескольких заголовках. Все методы должны быть объявлены в одном классе.
Для пространств имен функции из одного и того же пространства имен могут быть объявлены в нескольких заголовках (лучшим примером является почти стандартная функция подкачки).
Расширение III
Основным недостатком пространства имен является то, что в некотором коде вы можете не упоминать его, если используете ключевое слово «using»:
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
И вы даже можете ограничить "загрязнение" одним классом:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Этот «шаблон» является обязательным для правильного использования почти стандартной идиомы подкачки.
И это невозможно сделать со статическими методами в классах.
Итак, пространства имен C ++ имеют свою семантику.
Но это идет еще дальше, так как вы можете комбинировать пространства имен аналогично наследованию.
Например, если у вас есть пространство имен A с функцией AAA, пространство имен B с функцией BBB, вы можете объявить пространство имен C и перевести AAA и BBB в это пространство имен с ключевым словом, используя.
Заключение
Пространства имен предназначены для пространств имен.
Занятия для занятий.
C ++ был разработан таким образом, чтобы каждая концепция была разной и использовалась по-разному, в разных случаях, как решение разных проблем.
Не используйте классы, когда вам нужны пространства имен.
А в вашем случае вам нужны пространства имен.