Класс против структуры
Использование ключевого слова class или struct - дело вкуса вместе с '1005 * чувство ', которое оно производит на читателя. Технически они эквивалентны, но удобочитаемость лучше, если структуры используются для POD, а типы и классы C-struct для чего-либо еще.
Основные вещи, которые должны идти в конструкторе C ++ struct:, который инициализирует данные (мне не нравится использование memset, и он может позже откусить, если POD эволюционирует в нечто иное) или конструкцию из других типов, но не конструктор копирования.
Если вам нужно определить конструктор копирования или оператор присваивания, потому что сгенерированный компилятор недостаточно хорош, сделайте его классом.
Обычно используют структуры также для функторов, которые будут передаваться в алгоритмы STL и метапрограммирование шаблонов, как в
struct square_int {
int operator()( int value )
{
return value*value;
}
};
std::transform( v.begin(), v.end(), v.begin(), square_int() );
или
// off the top of my head
template <typename T>
struct is_pointer { enum { value = false } };
template <typename T>
struct is_pointer<T*> { enum { value = true } };
Методы-члены и свободные функции
Помимо того, что я сказал ранее, это не добавляет того, что уже отвечали другие, я хотел бы уделить некоторое внимание другим типам функций, которые вы комментируете в своем посте, в качестве операторов сравнения и тому подобного.
Операторы, которые должны быть симметричными (оператор сравнения, арифметика), операторы вставки и удаления и преобразования обычно лучше реализовать в виде свободных функций, независимо от того, объявляете ли вы их как класс или структуру.
Симметричные операторы (относительно типов данных) не являются симметричными, если они реализованы как функции-члены. Правила поиска не приведут левую сторону к вызову функции-члена, но применит то же приведение, чтобы соответствовать свободной функции.
// Example of symmetry with free functions where method would be asymmetric
int main()
{
std::string( "Hello " ) + "world"; // compiles as free / member function
"Hello " + std::string( "world" ); // compiles with free function, fails with member function definition of +
}
В приведенном выше коде, если operator + был методом-членом std :: string, компилятор не смог бы скомпилировать, поскольку он не может преобразовать литерал const char * в std :: string для использования метода member.
Вставка и извлечение из потоков всегда должны осуществляться как свободные функции, поскольку поток всегда находится в левой части операции.
Сохранение преобразований в виде свободных функций разделяет два разных типа. Если A и A 'могут быть преобразованы друг в друга, и вы решили реализовать преобразования в качестве членов A, тогда A должен знать A', и все виды использования A будут зависеть от A ', используете ли вы его или нет. Если вы определяете преобразование как свободную функцию, A завершается без A ', и связь между двумя классами / структурами будет меньше. То же самое касается преобразований в / из сети, сериализации и десериализации. Когда вы реализуете их внутри класса / структуры, вы заставляете всех пользователей знать об этих преобразованиях.