Существует множество заблуждений в существующих ответах.
Оба class
и struct
объявляют класс.
Да, возможно, вам придется изменить ваши ключевые слова, изменяющие доступ, внутри определения класса, в зависимости от того, какое ключевое слово вы использовали для объявления класса.
Но, помимо синтаксиса, единственной причиной выбора одного из них является соглашение / стиль / предпочтение.
Некоторым людям нравится придерживаться ключевого слова struct
для классов без функций-членов, потому что полученное определение «выглядит как» простая структура из C.
Точно так же некоторым людям нравится использовать ключевое слово class
для классов с функциями-членами и данными private
, потому что оно говорит «класс» и поэтому выглядит как примеры из их любимой книги по объектно-ориентированному программированию. 1022 *
Реальность такова, что это полностью зависит от вас и вашей команды, и это в буквальном смысле ничего не изменит для вашей программы.
Следующие два класса абсолютно эквивалентны во всех отношениях, кроме их имени:
struct Foo
{
int x;
};
class Bar
{
public:
int x;
};
Вы даже можете переключать ключевые слова при повторном выделении:
class Foo;
struct Bar;
(хотя это нарушает сборку Visual Studio из-за несоответствия, поэтому компилятор выдаст предупреждение при этом.)
и следующие выражения оба имеют значение true:
std::is_class<Foo>::value
std::is_class<Bar>::value
Обратите внимание, что вы не можете переключать ключевые слова при переопределении ; это только потому, что (согласно правилу одного определения) повторяющиеся определения классов в единицах перевода должны «состоять из одной и той же последовательности токенов» . Это означает, что вы даже не можете обменять const int member;
на int const member;
, и не имеете ничего общего с семантикой class
или struct
.