Какова история структуры/класса в С++?
Я беру класс по объектно-ориентированному программированию на С++. В недавнем назначении я определил функцию-член в 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 не подмножество С++?