После завершения моего класса C ++ мне показалось, что структуры / классы практически идентичны, за исключением нескольких незначительных отличий.
Я никогда раньше не программировал на C; но я знаю, что у него есть структуры. В C можно ли наследовать другие структуры и установить модификатор public / private?
Если вы можете сделать это на обычном C, зачем нам C ++? Что отличает классы от структуры?
Ответы:
В C ++ структуры и классы практически одинаковы; единственное отличие состоит в том, что там, где модификаторы доступа (для переменных-членов, методов и базовых классов) в классах по умолчанию являются частными, модификаторы доступа в структурах по умолчанию являются общедоступными.
Однако в C структура представляет собой просто совокупную коллекцию (общедоступных) данных и не имеет других функций, подобных классу: никаких методов, конструкторов, базовых классов и т. Д. Хотя C ++ унаследовал ключевое слово, он расширил семантику. (Это, однако, причина того, что в структурах по умолчанию все объекты общедоступны - структура, написанная как структура C, ведет себя так же.)
Хотя в C можно подделать ООП - например, определение функций, которые все принимают указатель на структуру в качестве своего первого параметра, или иногда принуждение структур с одними и теми же первыми несколькими полями к «подклассам / суперклассам» - это всегда своего рода прикручен, и на самом деле не является частью языка.
источник
Других отличий в доступе по умолчанию (публичный / частный) нет никакой разницы.
Однако некоторые магазины, которые кодируют на C и C ++, будут использовать «класс / структура» для обозначения того, что может использоваться в C и C ++ (структура), а которое - только C ++ (класс). Другими словами, в этом стиле все структуры должны работать с C и C ++. Это отчасти причина того, что разница была в первую очередь давным-давно, когда C ++ еще был известен как «C с классами».
Обратите внимание, что объединения C работают с C ++, но не наоборот. Например
И аналогично
работает только в C
источник
Я собираюсь добавить к существующим ответам, потому что современный C ++ теперь в ходу , и были созданы официальные основные рекомендации , чтобы помочь с такими вопросами.
Вот соответствующий раздел из рекомендаций:
Приведены примеры кода:
Class
Они хорошо подходят для членов, которые, например, являются производными друг от друга или взаимосвязаны. Они также могут помочь с проверкой работоспособности при создании экземпляра.Struct
s хорошо подходят для «мешков с данными», где на самом деле ничего особенного не происходит, но члены логически имеют смысл сгруппироваться вместе.Отсюда логично, что
class
es существуют для поддержки инкапсуляции и других связанных концепций кодирования, для которыхstruct
они просто не очень полезны.источник
struct
s самые портативные. Их можно использовать в C или C ++ или взад и вперед. Их также можно распаковать в Pythonstruct
, например, с помощью модуля. Если проект приоритизирует быть совместимым с другими языками, интерфейсов и систем, предпочитаютstruct
болееclass
. Для строго программно-внутренних дел предпочитайтеclass
.В C. невозможно определить функции-члены или получить структуры друг от друга.
Кроме того, C ++ - это не только «производные структуры» C +. Шаблоны, ссылки, определенные пользователем пространства имен и перегрузка операторов - все это не существует в C.
источник
power
о структурах в C. Итак, C ++ использует структуры только для «обратной» совместимости с C?struct
я имею в виду в основном пассивный тип POD.std::less
) определены как структуры, а не классы.Еще одно отличие C ++: когда вы наследуете класс из структуры без какого-либо спецификатора доступа, он становится публичным наследованием, тогда как, как и в случае класса, это частное наследование.
источник
C ++ использует структуры в первую очередь для 1) обратной совместимости с C и 2) типов POD. У структур C нет методов, наследования или видимости.
источник
std::less
) определены как структуры, а не классы.