Почему в С++ есть ключевое слово класса?

Этот вопрос пришел мне на ум, когда я изучил С++ с фоном C. Даже если был struct, почему Stroustrup почувствовал, что необходимо ввести ключевое слово class? Я пытался спросить людей в то время, но не смог получить удовлетворительный ответ. Так может ли сообщество Qaru ответить на него?

Ответ 1

Как говорит Дэвид, структуры по умолчанию общедоступны, классы по умолчанию являются закрытыми. Большая точка зрения заключается в том, что добавление ориентации объекта на C было большим изменением, и предоставление разработчикам способов выразить себя точно - важная часть разработки языка.

Как выясняется, различие между структурой и классом довольно незначительно с технической точки (default-public vs default-private), но в умах программистов это различие довольно велико. Добавление ключевого слова было важным способом подчеркнуть природу OO С++.

Ответ 2

В Проект и эволюция С++, описывая, как была разработана объектная модель С++ и виртуальные функции, он пишет (стр. 76):

В этот момент объектная модель становится реальной в том смысле, что объект больше, чем простая агрегация для членов данных класса. Объектом класса С++ с виртуальной функцией является принципиально другой зверь из простой C `struct`. Тогда почему же я на данный момент не решил сделать структуры и классы разными понятиями?

Мое намерение состояло в том, чтобы иметь одну концепцию: один набор правил компоновки, один набор правил поиска, один набор правил разрешения и т.д. Я был убежден, что если `struct` стал означать "C и" совместимость "с пользователями и" классом "стала означать" С++ и расширенные функции ", сообщество попадет в два разных лагеря, которые вскоре перестанут связываться. Быть способным использовать как можно больше или немного языковых функций при разработке класса, было важной идеей для меня. Только одна концепция поддержала бы мои идеи о плавном и постепенном переходе от" традиционного программирования в стиле С "через абстракцию класса к объектно-ориентированному программированию. Только одна концепция поддержала бы это понятие" вы платите только за то, что используете".

Итак, похоже, что ключевое слово class было введено для указания ориентации объекта на С++ и , затем была введена его совместимость с ключевым словом struct.

Ответ 3

Первоначально С++ назывался "C с классами"

EDIT:
Хотя следующие предположения правдоподобны, причина для двух ключевых слов была, пожалуй, практической по своей природе: сохраняя синтаксис и семантику структуры обратной совместимости, можно было ввести С++ в существующие программы (вместо того, чтобы повторять все структуры и добавлять к ним ключевое слово "public" ).

[Спекуляция] Тот факт, что у меня есть два ключевых слова, возможно, может быть связан с генезисом нового языка, причем первоначально функции OO были исключительно связаны с новым ключевым словом "класс". Поскольку это созревшее, было решено, что было бы удобно вводить некоторые функции OO для структур, а также сохранить эти...

... два понятия для двух разных применений:

  • struct: для типично малых и только для данных объектов, с его членами public по умолчанию. (но который также может быть менее прозрачным и иметь поведение также).
  • class: для объектов, которые обычно группируют данные и поведение (функции) и с его членами private по умолчанию, чтобы реализовать скрытие данных, инкапсуляцию и другие функции OO.

Структура предназначена для полностью или в основном прозрачных "объектов" без скрытия или поведения данных в продолжении ее не-объектно-ориентированного использования (хотя такие прозрачные конструкции занимают место в более широком контексте программ OO). Классы, предназначенные для введения скрытых данных и других методов ОО.

Альтернативой могло быть использование ключевого слова struct для обоих способов использования, требующее, чтобы программисты намеревались в своем "классе" явно явно определять частных членов. В то время, когда концепции OO не были широко поняты в сообществе программистов (см. Другие ответы в этом сообщении), вероятно, было похоже, что отдельное ключевое слово лучше поможет "обобщить" новые функции/понятия.

Ответ 4

Дословный ответ уже задан: "члены структуры по умолчанию общедоступны, члены классов по умолчанию являются закрытыми". И большинство программистов однозначно идентифицируют все свои разделы как частные, защищенные или публичные.

Так что в буквальном смысле вы ничего не можете сделать с классом, который вы не можете сделать с помощью структуры typedef.

Однако многие пользователи С++ используют "struct", чтобы также идентифицировать объекты С++, которые " простые старые структуры данных". Идея PODS - очень полезная концепция С++. PODS легко создаются, копируются и "не имеют сюрпризов", а классы намного опаснее.

Например, PODS может быть инициализирован в массивы во время компиляции, что делает их очень полезными для статических таблиц.

Поэтому я настоятельно рекомендую вам следовать одному и тому же соглашению - structs - PODS, все остальное - класс.

Ответ 5

Bjarne Stroustrup, оригинальный дизайнер С++, был сильно вдохновлен Simula языком программирования. Именно там он получил концепцию класса и название "класс".

Как указано в ответе, который цитируется "Дизайн и эволюция", реальный вопрос, который задал себе Бьярне, был не "Зачем вводить ключевое слово класса?". Вместо этого он спросил: "Должна ли структура вести себя аналогично классу?". Бьярн решил, что они должны. В этой статье с 1997 года утверждается, что он принял неправильное решение.