Каковы различия между структурой и классом в C ++? - PullRequest
413 голосов
/ 18 сентября 2008

Этот вопрос уже задавался в контексте C # /. Net .

Теперь я хотел бы изучить различия между структурой и классом в C ++. Пожалуйста, обсудите технические различия, а также причины выбора того или иного в дизайне OO.

Начну с очевидной разницы:

  • Если вы не укажете public: или private:, члены структуры являются открытыми по умолчанию; по умолчанию члены класса являются закрытыми.

Я уверен, что есть и другие отличия в неясных углах спецификации C ++.

Ответы [ 29 ]

4 голосов
/ 18 сентября 2008

Нет в спецификации, нет. Основное различие заключается в ожиданиях программистов, когда они читают ваш код через 2 года. структуры часто предполагаются как POD. Структуры также используются в метапрограммировании шаблонов, когда вы определяете тип для целей, отличных от определения объектов.

3 голосов
/ 12 ноября 2011

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

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
2 голосов
/ 18 сентября 2008

Вот хорошее объяснение: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Итак, еще раз: в C ++ структура идентична классу, за исключением того, что члены структуры по умолчанию имеют открытую видимость, а члены класса по умолчанию имеют закрытую видимость.

2 голосов
/ 18 апреля 2010

ИСО МЭК 14882-2003

9 Классы

§ 3

Структура - это класс, определенный с ключ класса struct; его члены и базовые классы (пункт 10) public по умолчанию (пункт 11).

2 голосов
/ 18 сентября 2008

Это просто соглашение. Структуры могут быть созданы для хранения простых данных, но позже будут развиваться с добавлением функций-членов и конструкторов. С другой стороны, необычно видеть что-то кроме public: доступ в структуре.

2 голосов
/ 19 декабря 2018
  1. Членом класса, определенным с ключевым словом class, являются private по умолчанию. Члены класса, определенного с помощью ключевых слов struct (или union), по умолчанию public.

  2. В отсутствие спецификатора доступа для базового класса public предполагается, когда производный класс объявлен struct и private предполагается, когда класс объявлен class.

  3. Вы можете объявить enum class, но не enum struct.

  4. Вы можете использовать template<class T>, но не template<struct T>.

Также обратите внимание, что стандарт C ++ позволяет вам заранее объявить тип как struct, а затем использовать class при объявлении типа и наоборот. Кроме того, std::is_class<Y>::value равно true для Y, являющегося struct и class, но равно false для enum class.

1 голос
/ 10 июля 2012
  • . В классах все члены по умолчанию являются частными, но в структуре по умолчанию участники являются публичными.

    1. Нет такого термина, как конструктор и деструктор для структур, но для компилятора классов создается значение по умолчанию, если вы не предоставите.

    2. Размер пустой структуры равен 0 байтам, поскольку размер пустого класса равен 1 байт. Тип доступа к структуре по умолчанию является открытым. Структура должна обычно используется для группировки данных.

    Тип доступа по умолчанию для класса является закрытым, а режим по умолчанию для наследование является частным. Класс должен использоваться для группировки данных и методы, которые оперируют этими данными.

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

    В C ++ структуры и классы передаются по значению, если явно де-ссылки. На других языках классы и структуры могут иметь четкая семантика - т.е. объекты (экземпляры классов) могут быть переданы по ссылке и структуры могут быть переданы по значению. Примечание: есть комментарии, связанные с этим вопросом. Смотрите страницу обсуждения, чтобы добавить к разговору.

1 голос
/ 04 августа 2011

В других ответах упоминались частные / публичные значения по умолчанию (но обратите внимание, что структура - это класс, это структура; это не два разных элемента, а два способа определения одного и того же элемента).

Что может быть интересно отметить (особенно потому, что спрашивающий, вероятно, использует MSVC ++, поскольку он упоминает «неуправляемый» C ++), это то, что Visual C ++ жалуется при определенных обстоятельствах, если класс объявляется с class, а затем определяется с помощью struct (или, возможно, наоборот), хотя стандарт гласит, что это совершенно законно.

1 голос
/ 29 сентября 2016

Хотя это подразумевается другими ответами, прямо не упоминается - что структуры совместимы с C, в зависимости от использования; классы нет.

Это означает, что если вы пишете заголовок, который хотите совместить с C, то у вас нет другого выбора, кроме struct (которая в мире C не может иметь функции; но может иметь указатели на функции).

0 голосов
/ 09 июня 2017

Основное различие между структурой и классом состоит в том, что в структуре вы можете объявлять только переменные данных разных типов, в то время как в классе вы можете объявлять переменные данных, функции-члены и, таким образом, вы можете манипулировать переменными данных через функции.

-> Еще одна удобная вещь, которую я нахожу в классе против структуры, заключается в том, что при реализации файлов в программе, если вы хотите снова и снова выполнять некоторые операции над структурой для каждого нового набора операций, вам необходимо создать отдельную функцию и Вы должны передать объект структуры после чтения его из файла, чтобы выполнить с ним некоторые операции. в то время как в классе, если вы делаете функцию, которая выполняет некоторые операции с данными, необходимыми каждый раз ... это легко, вам просто нужно прочитать объект из файла и вызвать функцию ..

Но это зависит от программиста, какой путь он / она находит подходящим ... по моему мнению, я предпочитаю класс каждый раз только потому, что он поддерживает ООП, и именно поэтому он реализован почти на всех языках и его замечательная особенность всех времен программирование; -)

И да, самое незабытое различие, которое я забыл упомянуть, состоит в том, что класс поддерживает скрытие данных, а также поддерживает операции, выполняемые со встроенными типами данных, в то время как struct этого не делает!

...