Почему структура и класс существуют в 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.
это кажется довольно избыточным и запутанным, представляя яркий непоследовательность.
у меня два вопроса:
есть ли какие-либо технические различия, которые я пропустил, которые значительно различают
struct
иclass
?каково обоснование, если таковое имеется, этой неуклюжести?
я игнорирую разницу между спецификаторами доступа по умолчанию, потому что все это уже знают.
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
все еще класс.
- есть ли какие-либо технические различия, которые я пропустил, которые значительно различают структуру и класс?
я уже ответил, но, очевидно, есть нет разницу между классами, объявленными с struct
и class
ключевые слова, beyond †.
† разница со спецификатором доступа по умолчанию (как вы уже знаете, а также описали здесь), который является их только разницы.
почему структура и класс существуют в C++?
struct
происходит от C и существует в C++ в основном по причинам совместимости с языком программирования C.
есть ли технические различия, которые я пропустил значительно отличить
struct
иclass
?
основное различие между a struct
и class
для struct
члены public
доступ по умолчанию тогда как для class
члены private
доступ по умолчанию.
ключевое слово class
используется в аргументах шаблона не определяет класс, а скорее не аргумент шаблона типа и может использоваться взаимозаменяемо с ключевым словом typename
.
а почему вы не можете использовать struct
ключевое слово для указания аргумента шаблона не типа, причины являются историческими, и я думаю, вы должны спросить Бьярне об этом:) или обратитесь к этому SO ответ информация за сцена.