Стоит вспомнить происхождение C ++ и его совместимость с C.
C имеет структуры, не имеет понятия инкапсуляции, поэтому все открыто.
Публичность по умолчанию обычно считается плохой идеей при использовании объектно-ориентированного подхода, поэтому при создании формы C, которая по своей природе благоприятна для ООП (вы можете сделать ОО в С, но это вам не поможет) Это была идея в C ++ (изначально «C With Classes»), имеет смысл сделать членов закрытыми по умолчанию.
С другой стороны, если бы Страуструп изменил семантику struct
так, чтобы его члены были по умолчанию частными, это нарушило бы совместимость (это уже не так часто, как расходились стандарты, но все действительные программы на Си были также действительными программами на C ++, которые оказали большое влияние на укрепление позиций C ++.
Итак, новое ключевое слово, class
, было введено в точности как структура, но по умолчанию закрытое.
Если бы C ++ появился с нуля, без истории, то у него, вероятно, было бы только одно такое ключевое слово. Это также, вероятно, не оказало бы такого воздействия.
В общем, люди склонны использовать struct, когда они делают что-то вроде того, как структуры используются в C; открытые члены, нет конструктора (если он не входит в объединение, вы можете иметь конструкторы в структурах, как и в случае с классами, но люди обычно этого не делают), никаких виртуальных методов и т. д. Так как языки так много для общения с людьми, которые читают код, и для инструктажа машин (иначе мы будем придерживаться ассемблера и необработанных кодов виртуальных машин), это хорошая идея придерживаться этого.