Почему структура и класс существуют в C++?

как известно, struct и class взаимозаменяемы во многих местах языка. Как ни странно, сами ключевые слова не обязательно соответствуют языку, используемому в стандарте. Например, в проекте стандарта N4567 [class] / 10,

A POD struct109 является классом non-union, который является тривиальный класс и класс стандартной компоновки, и не имеет нестатических данных элементы типа non-POD struct, non-POD union (или массив таких типы.) Кроме того, POD union это объединение, которое является тривиальным класс и класс стандартной компоновки, и не имеет нестатических членов данных типа non-POD struct, non-POD union (или массив таких типов). А POD класс!--18--> - это класс, который является либо структурой POD, либо объединением POD.

в более упрощенных условиях, struct и class взаимозаменяемы в следующих случаях:

  • объявление a "класс"!--31-->
  • объявление типа перечисления с областью видимости
  • разработанный спецификатор типа, если "класс" не был объявлен с union

однако, struct явно нельзя использовать в объявлении шаблона для введения параметров шаблона типа:

template <struct T> // error

Я не вижу никакой существенной разницы между struct и class, даже в приведенном выше примере стручка, потому что POD struct как определено в стандарте может быть объявлено с помощью либо struct или class.

[класс] / 8 A структура стандартной компоновки стандартная-макет класса определяется с помощью структура ключа класса или класс-ключ класса. Ля соединение стандарт-плана - класс стандартной компоновки, определенный с помощью class-key union.

это кажется довольно избыточным и запутанным, представляя яркий непоследовательность.

у меня два вопроса:

  1. есть ли какие-либо технические различия, которые я пропустил, которые значительно различают struct и class?

  2. каково обоснование, если таковое имеется, этой неуклюжести?

я игнорирую разницу между спецификаторами доступа по умолчанию, потому что все это уже знают.

2 ответов


почему структура и класс существуют в C++?

причина существования struct для совместимости с C.

почему тогда "C с классами" ввел новое ключевое слово class когда вы могли бы использовать struct для того же самого, вы можете спросить. Смотрите это так что ответ правдоподобных домыслов. Короче говоря, это, вероятно, потому, что было желание сделать акцент на ОП, в котором класс - это широко используемый термин. Только Страуструп может знать наверняка.

смущает, что сами ключевые слова не обязательно соответствуют языку, используемому в стандарте

что нужно понять, так это то, что понятие класс - это не одно и то же с ключевого слова class.

существует три ключевых слова для объявления классов. Эти ключевые слова, известные как class-keys, являются class, struct и union. Этот несоюзные классы, объявленные с помощью либо class или struct ровно то же самое, за исключением . Классы Union отличаются от классов non-union.

однако struct явно не может использоваться в объявлении шаблона для введения параметров шаблона типа

C++ повторно использует ключевые слова для разных целей в разных контекстах. class ключевое слово в контексте объявления класса не полностью совпадает с class ключевое слово в определении аргумента шаблона. Одно ключевое слово, эквивалентное другому в одном контексте, не делает его эквивалентным во всех контекстах. Причина повторного использования ключевых слов в разных, но похожих контекстах (static другой пример), чтобы избежать введения новых ключевых слов, которые вводят больше отверстий с совместимостью с C (или более ранним стандартом c++), у которого нет новых ключевых слов.

причина почему class ключевое слово было повторно использовано в контекст аргументов типа шаблона был, вероятно, потому, что классы являются типами и поэтому обычно используются в качестве параметров типа. Существует также typename ключевое слово, которое было добавлено позже и (почти) взаимозаменяемо с class в объявлении аргумента типа шаблона, но также используется в другом месте (зависимые имена типов), где class не используется. Смотрите это ответ ссылки и резюме о том, почему отдельное ключевое слово было добавлено в этом контексте.

почему struct не вы можете спросить, что используется в контексте в качестве эквивалента. Ну, это еще один вопрос к Страуструпу или комитету. Это противоположный выбор, чем то, что сделал Комитет, когда enum class/enum struct была введена.

я не вижу никакой существенной разницы между struct и class

хорошо. Нет ничего, кроме

это кажется довольно избыточным и запутанным, представляя яркий непоследовательность.

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

  1. есть ли какие-либо технические различия, которые я пропустил, которые значительно различают структуру и класс?

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

разница со спецификатором доступа по умолчанию (как вы уже знаете, а также описали здесь), который является их только разницы.


почему структура и класс существуют в C++?

struct происходит от C и существует в C++ в основном по причинам совместимости с языком программирования C.

есть ли технические различия, которые я пропустил значительно отличить struct и class?

основное различие между a struct и class для struct члены public доступ по умолчанию тогда как для class члены private доступ по умолчанию.

ключевое слово class используется в аргументах шаблона не определяет класс, а скорее не аргумент шаблона типа и может использоваться взаимозаменяемо с ключевым словом typename.

а почему вы не можете использовать struct ключевое слово для указания аргумента шаблона не типа, причины являются историческими, и я думаю, вы должны спросить Бьярне об этом:) или обратитесь к этому SO ответ информация за сцена.