В C ++ различие между структурой и классом заключается в видимости по умолчанию его содержимого (то есть public для структуры и private для класса). Я предполагаю, что эта разница заключалась в том, чтобы сохранить совместимость с C.
Но семантически, я думаю, это подлежит интерпретации.
Пример структуры
В структуре все общедоступно (по умолчанию), то есть пользователь может изменять каждое значение данных по своему усмотрению, и все же структура остается допустимым объектом. Пример структуры:
struct CPoint
{
int x ;
int y ;
CPoint() : x(0), y(0) {}
int getDistanceFromOrigin() const
{
return std::sqrt(x * x + y * y) ;
}
} ;
inline CPoint operator + (const CPoint & lhs, const CPoint & rhs)
{
CPoint r(lhs) ;
r.x += rhs.x ;
r.y += rhs.y ;
return r ;
}
Вы можете изменить значение x для CPoint, и оно все еще остается действительным CPoint.
Обратите внимание, что, в отличие от некоторых, структура C ++ может (и должна) иметь конструкторы, методы и функции, не являющиеся членами, присоединенные к ее интерфейсу, как показано выше.
Пример класса
В классе все является закрытым (по умолчанию), что означает, что пользователь может изменять данные только через четко определенный интерфейс, поскольку класс должен сохранять свои внутренние данные действительными. Пример класса:
class CString
{
public :
CString(const char * p) { /* etc. */ } ;
CString(const CString & p) { /* etc. */ } ;
const char * getString() const { return this->m_pString ; }
size_t getSize() const { return this->m_iSize ; }
void copy { /* code for string copy */ }
void concat { /* code for string concatenation */ }
private :
size_t m_iSize ;
char * m_pString ;
} ;
inline CString operator + (const CString & lhs, const CString & rhs)
{
CString r(lhs) ;
r.concat(rhs) ;
return r ;
}
Вы видите, что когда вы вызываете concat, указатель может нуждаться в перераспределении (чтобы увеличить его размер), а размер строки должен обновляться автоматически. Вы не можете позволить пользователю изменять строку вручную и забыть обновить размер.
Итак, класс должен защищать свои внутренние данные и быть уверенным, что все будет корректно обновляться при необходимости.
Заключение
Для меня разница между структурой и классом заключается в зависимости между агрегированными данными.
Если каждый фрагмент данных независим от всех остальных, то, возможно, вам следует рассмотреть структуру (т. Е. Класс с открытым элементом данных).
Если нет, или, если сомневаетесь, используйте класс.
Теперь, конечно, в C # структура и класс - это два разных типа объектов (то есть типы значений для структур и ссылочные типы для классов). Но это не из этой темы, я думаю.