Какова история структуры/класса в С++?

Я беру класс по объектно-ориентированному программированию на С++. В недавнем назначении я определил функцию-член в struct. Мой преподаватель объяснил, что, хотя он и компилируется для использования функций-членов внутри структур, он предпочел бы, чтобы мы не использовали для обратной совместимости с C и (особенно в этом классе начинающего) практиковать хорошую инкапсуляцию данных - мы должны использовать struct для типов, которые содержат в основном данные, и class для приложений, которые извлекают выгоду из более процедурной инкапсуляции. Он указал, что эта практика исходит из истории структур/классов в С++, о чем я хотел бы узнать больше.

Я знаю, что структуры функционально такие же, как и классы, за исключением доступа к члену/наследованию по умолчанию. Мой вопрос:

Почему структуры и классы включены в С++? Из моего фона в С#, где структуры и классы имеют важные отличия, похоже, что struct в С++ - это просто синтаксический сахар для определения классов с общедоступностью по умолчанию. Это?

Я не ищу мнения о том, когда/почему нужно использовать вместо другого - я родился хорошо после этих конструкций, и я ищу историю из них. Были ли они задуманы вместе? Если да, то почему? Если нет, то что было первым, и почему второе добавилось? Я понимаю, что в этом сообществе есть много почтенных старейшин, которые могут иметь живую память об источниках этих признаков, а также ссылки на публикации стандартов или примеры кода, в которых как первый, так и первый появились, добавят к полезности ответов.

Обратите внимание, что этот вопрос не:

Ответы

Ответ 1

Чтобы облегчить разработку заголовков многоугольника.

C и С++ - это отдельные языки, но язык С++ предназначен для предоставления большого полезного общего подмножества с языком C. Несколько широко используемых конструкций на языке С++ имеют одинаковый смысл (или почти такой), как у них на языке C. В случае struct язык С++ определяет его как синтаксический сахар для class, который приближается к поведению a struct на языке C, а именно, что члены по умолчанию public. Таким образом, программа или ее часть могут быть записаны в этом общем подмножестве. Это позволяет, например, предоставить библиотеке одиночный заголовочный файл, который объявляет один и тот же API для обеих программ, написанных на языке C, и программ, написанных на языке С++.

Некоторые различия между языком C и языком С++ перечислены в вопросе, который с тех пор был закрыт как слишком широкий. С точки зрения программирования человека на этом общем языке подмножества эти различия можно трактовать как "поведение, определяемое реализацией", когда компиляторы для языка C вызывают одно поведение, а компиляторы для языка С++ создают другой.

Фактически, стандарт С++ предоставляет механизмы, помогающие разработке программ polyglot, которые действительны как на языках C, так и на С++. Спецификатор extern "C" extern "C" позволяет программе записываться частично на C и частично на С++. Символ __cplusplus используется в #ifdef __cplusplus условиях для условного включения макросов, спецификаторов связей и других особенностей, которые должен видеть только один из двух языков.

Ответ 2

В старые времена (конец 1980-х или начало 1990-х годов) компилятор С++ (затем называемый cfront) переводил код С++ в код C. Этот С++ сильно отличался от текущего С++ 11 или С++ 14 (или даже старого С++ 03).

Я не помню подробностей, но могло случиться, что struct в то время полностью анализировался, но передавался без изменений в сгенерированный код C, а class был предварительно обработан чем-то другим (и был переведен на a struct).

Возможно, я ошибаюсь, это из моей человеческой памяти, и я использовал только (на SunOS3, Sun3/160 рабочих станциях) пару раз, что cfront. Это оставило меня невпечатленным, но интересным. В то время перевод на C-код добавил значительное время для процесса сборки. Но многое изменилось, перевод на C сегодня имеет большой смысл...

(В те дни программа Hello World в Ada заняла 5 минут, и с cfront она может составлять 3 минуты, но на C это было меньше минуты)

Впоследствии определение С++ изменилось, а struct foo { действительно эквивалентно class foo{ public:, но я не уверен, что это было в примитивном компиляторе С++.

Ответ 3

Оба были включены в исходный язык С++, но struct long предшествует С++ на языке C.

С++ включает struct, потому что он унаследовал их от C. Не было причин удалить их из С++ и сломать существующие базы кода C, которые могут быть скомпилированы с помощью компилятора С++.

С++ вводит class в качестве нового ключевого слова. Предположительно было введено ключевое слово, чтобы предоставить возможность дифференцировать вновь созданные классы С++ из существующих struct в устаревшие базы кода C.

Ответ 4

С++ - это, прежде всего, надмножество C. Итак (в основном), если вы можете что-то сделать на C, вы можете сделать это на С++. Структуры являются функцией C и были включены в С++. Обратитесь к этому по причинам С++ не является истинным надмножеством: Где C не подмножество С++?