в чем разница между struct и class
Разница между структурами C и C ++
В C ++ struct и class — это одно и то же, за исключением того, что по умолчанию для struct используется общедоступная видимость, а для классов по умолчанию — private видимость.
Некоторые важные различия между структурами C и C ++:
// C программа для демонстрации этого прямого
// инициализация члена в C невозможна
#include
// Программа для водителя
>
/ * Вывод: ошибка компилятора
6: 8: ошибка: ожидается ‘:’, ‘,’, ‘;’, ‘>’ или
токен ‘__attribute__’ before ‘=’
// Программа CPP для инициализации члена данных в c ++
#include
using namespace std;
// Программа для водителя
Выход:
// C программа со структурным статическим членом
>
/ * 6: 5: ошибка: ожидаемый список спецификаторов-спецификаторов
// C ++ программа со структурным статическим членом
// C-программа для демонстрации того, что Конструктор не разрешен
#include
// Программа для водителя
>
/ * Вывод: ошибка компилятора
[Ошибка] ожидаемый спецификатор-квалификатор-список
[Ошибка] ожидаемые спецификации объявления или
«. » перед числовой константой
[Ошибка] ‘необъявленный’ (первое использование
5555555555 в этой функции)
// Программа CPP для инициализации члена данных в c ++
#include
using namespace std;
// Программа для водителя
Выход:
// C программа для иллюстрации пустой структуры
#include
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
C#: Отличие класса от структуры (class vs struct)
Сегодня я решил рассказать о одном из частых вопросах на собеседованиях «чем отличается класс от структуры в C#«.
На самом деле ответить на этот вопрос можно очень коротко. Структура в C# является типом передающимся по значению, класс же является ссылочным типом. По большей части сказать больше нечего. Однако данный ответ врятли внесет какую то ясность людям, которые не понимают что значит передавать по ссылке или передавать по значению. Поэтому давайте рассмотрим данный вопрос подробней на примерах. Предположим что у нас есть «class cA» и struct «sA».
Первое важное отличие ссылочного типа от типа передаваемого по значению это то, что значимый тип не может быть равен null.
Так как структура не может быть равна null то она должна быть инициализирована. При этом инициализация структуры происходит по умолчанию нулевыми значениями. В следствие этого вы не можете создать конструктор по умолчанию для структур. А как следствие не можете инициализировать значения переменных в структурах inline.
Но главным различаем данных двух конструкций является их поведение при присваивании. Это повередение очень легко рассмотреть на примере:
Данный пример очень наглядно демонстрирует различие между передачей значения по ссылки и по значению. Как видно передача по значению подрузомевает создание новой переменной и копирование в нее всех значений. Что в дальнейшем позволяет работать с двумя различными объектами. Передача же по ссылке подрузомевает создание новой ссылки на уже имеющиеся значения.
Если проводить аналогию, например, с Windows, то передача по значению — это копирование ваших файлов, а передача по ссылке — создание ярлыков.
Каковы различия между структурой и классом в C ++?
Теперь я хотел бы изучить различия между структурой и классом в C ++. Пожалуйста, обсудите технические различия, а также причины выбора того или другого в ОО-дизайне.
Начну с очевидной разницы:
Я уверен, что в неясных уголках спецификации C ++ можно найти и другие отличия.
30 ответов
Вы забываете о сложной второй разнице между классами и структурами.
И просто для полноты картины более широко известное различие между классом и структурой определено в (11.2):
Дополнительное отличие: ключевое слово class можно использовать для объявления параметров шаблона, а ключевое слово struct нельзя использовать таким образом.
Стоит помнить о происхождении C ++ и его совместимости с C.
В C есть структуры, в нем нет концепции инкапсуляции, поэтому все является общедоступным.
Общедоступность по умолчанию обычно считается плохой идеей при использовании объектно-ориентированного подхода, поэтому создание формы C, которая изначально способствовала бы ООП (вы можете выполнять ОО на C, но это вам не поможет), что было Идея в C ++ (первоначально «C с классами») имеет смысл сделать члены закрытыми по умолчанию.
С другой стороны, если бы Страуструп изменил семантику struct так, чтобы его члены по умолчанию были закрытыми, это нарушило бы совместимость (это уже не так часто, поскольку стандарты расходятся, но все допустимые программы C были также действительные программы на C ++, которые оказали большое влияние на то, чтобы дать C ++ точку опоры).
Таким образом, было введено новое ключевое слово class в точности как структура, но по умолчанию закрытое.
Если бы C ++ появился с нуля, без истории, то, вероятно, у него было бы только одно такое ключевое слово. Это также, вероятно, не повлияло бы на то, что произвело.
В общем, люди будут склонны использовать структуры, когда они делают что-то вроде того, как структуры используются в C; открытые члены, без конструктора (пока он не в объединении, вы можете иметь конструкторы в структурах, как и в случае с классами, но люди не склонны), никаких виртуальных методов и т. д. языки предназначены как для общения с людьми, читающими код, так и для инструктирования машин (иначе мы бы придерживались ассемблерных и необработанных кодов операций виртуальной машины), поэтому неплохо придерживаться этого.
Например, программа 1 не компилируется, а программа 2 работает нормально.
Например, программа 3 не компилируется, а программа 4 работает нормально.
Однако вам нужно понимать, что это просто абстракции. Вполне возможно создавать структуры, которые очень похожи на классы, и классы, которые очень похожи на структуры. Фактически, самые ранние компиляторы C ++ были просто предварительными компиляторами, которые переводили код C ++ в C. Таким образом, эти абстракции являются преимуществом для логического мышления, а не обязательно активом для самого компьютера.
Помимо того, что каждый из них представляет собой отдельный тип абстракции, классы предоставляют решения для загадки именования кода C. Поскольку у вас не может быть более одной функции с одним и тем же именем, разработчики использовали шаблон _ (). например mathlibextreme_max (). Группируя API в классы, аналогичные функции (здесь мы называем их «методами») можно сгруппировать вместе и защитить от именования методов в других классах. Это позволяет программисту лучше организовать свой код и увеличить повторное использование кода. По крайней мере, теоретически.
Нет в спецификации, нет. Основное различие заключается в ожиданиях программистов, когда они прочитают ваш код через 2 года. часто предполагается, что структуры являются POD. Структуры также используются в метапрограммировании шаблонов, когда вы определяете тип для целей, отличных от определения объектов.
Еще одно замечание: если вы обновили устаревшее приложение, в котором были структуры для использования классов, вы можете столкнуться со следующей проблемой:
В старом коде есть структуры, код был очищен и заменен на классы. Затем к новому обновленному классу были добавлены одна или две виртуальные функции.
Когда виртуальные функции находятся в классах, компилятор внутренне добавит дополнительный указатель на данные класса, чтобы указать на функции.
Если бы в старом коде где-то структура была очищена с помощью memfill, чтобы очистить все до нулей, это могло бы сломать старый унаследованный код, это также уничтожило бы дополнительные данные указателя.
Итак, еще раз: в C ++ структура идентична классу, за исключением того, что члены структуры по умолчанию имеют общедоступную видимость, а члены класса по умолчанию имеют частную видимость.
Это просто условность. Структуры могут быть созданы для хранения простых данных, но со временем они будут развиваться с добавлением функций-членов и конструкторов. С другой стороны, необычно видеть что-либо кроме public: access в структуре.
9 классов
. В классах все члены по умолчанию частные, но по структуре участники по умолчанию являются общедоступными.
Для структур не существует таких терминов, как конструктор и деструктор, но для классов компилятор создает значения по умолчанию, если вы не предоставляете их.
Короче говоря, соглашение заключается в использовании структуры, когда цель состоит в том, чтобы группировать данные и использовать классы, когда нам требуется абстракция данных и, возможно наследование.
Это означает, что если вы пишете заголовок, который хотите, чтобы он был совместим с C, тогда у вас нет другого выбора, кроме структуры (которая в мире C не может иметь функций; но может иметь указатели на функции).
Класс имеет значение только в контексте разработки программного обеспечения. В контексте структур данных и алгоритмов класс и структура не сильно отличаются. Нет никакого правила, ограничивающего указание на член класса.
При разработке большого проекта с множеством людей без класса вы, наконец, можете получить сложный связанный код, потому что каждый использует любые функции и данные, которые им нужны. class предоставляет элементы управления разрешениями и наследников для улучшения разделения и повторного использования кодов.
Если вы прочитаете некоторые принципы разработки программного обеспечения, вы обнаружите, что большинство стандартов не могут быть легко реализованы без классов. Например: http://en.wikipedia.org/wiki/SOLID_%28object-oriated_design%29
Кстати, когда структура выделяет небольшой объем памяти и включает в себя несколько переменных, переменные типа значения указывают, что значения встроены в то место, где выделяется структура. Напротив, значения переменных ссылочного типа являются внешними и ссылаются на указатель, который также встроен в место, где размещается структура.
Исходя из всех этих факторов, можно сделать вывод, что концепт Class очень подходит для представления объектов реального мира, а не «структур». Во многом потому, что концепции ООП, используемые в классе, очень практичны при объяснении сценариев реального мира, поэтому их легче объединить с реальностью. Например, наследование по умолчанию для структур является общедоступным, но если мы применим это правило в реальном мире, это будет смешно. Но в классе по умолчанию наследование является частным, что более реалистично.
Основное различие между ключевым словом структуры и класса в oops заключается в том, что в структуре отсутствуют публичные и частные объявления членов. А член данных и функция-член могут быть определены как публичные, частные, а также защищенные.
** ОБНОВЛЕНИЕ: ** Не обращайте внимания на этот ответ. Я не рассматривал возможность того, что для структуры значение было неинициализировано, а просто оказалось равным 0. Разницы в инициализации между структурой и классом нет.
Я вижу еще одно различие между структурами и классами, связанное с инициализацией по умолчанию.
Запустите этот код и проверьте myTester. Вы обнаружите, что для m_Foo структура m_Foo.a была инициализирована значением 0, но для m_Bar класс m_Bar.a не инициализирован. Таким образом, похоже, есть разница в том, что конструктор по умолчанию делает для структуры и класса. Я вижу это в Visual Studio.
Основное различие между структурой и классом заключается в том, что в структуре вы можете объявлять только переменные данных с разными типами данных, в то время как в классе вы можете объявлять переменные данных, функции-члены и, таким образом, вы можете управлять переменными данных с помощью функций.
И да, самое незабываемое различие, о котором я забыл упомянуть, заключается в том, что класс поддерживает скрытие данных, а также поддерживает операции, которые выполняются со встроенными типами данных, в то время как struct этого не делает!
Я нашел другое отличие. если вы не определяете конструктор в классе, компилятор определит его. но в структуре, если вы не определяете конструктор, компилятор также не определяет конструктор. поэтому в некоторых случаях, когда нам действительно не нужен конструктор, лучше выбрать struct (совет по производительности). и извините за мой плохой английский.
В основном методе
Я могу создать экземпляр этого класса, используя новый оператор, который выделяет память для этого класса
и сохраняет его базовый адрес в переменной типа MyClass (_myClassObject2).
В приведенной выше программе MyClass _myClassObject2 = _myClassObject1; инструкция указывает, что обе переменные типа MyClass
И будет указывать на то же место в памяти.
По сути, он назначает ту же ячейку памяти другой переменной того же типа.
Поэтому, если какие-либо изменения, внесенные в один из объектов типа MyClass, повлияют на другой
поскольку оба указывают на одно и то же место в памяти.
«_myClassObject1.DataMember = 10;» в этой строке оба элемента данных объекта будут содержать значение 10.
«_myClassObject2.DataMember = 20;» в этой строке оба члена данных объекта будут содержать значение 20.
В конце концов, мы получаем доступ к именам данных объекта через указатели.
В отличие от классов, структуры являются типами значений. Например:
В приведенной выше программе
создание экземпляра объекта типа MyStructure с помощью оператора new и
сохранение адреса в переменной _myStructObject типа MyStructure и
присвоение значения 10 элементу данных структуры с помощью «_myStructObject1.DataMember = 10».
Он может быть абстрактным, запечатанным, статическим и частичным и не может быть частным, защищенным или защищенным внутренним.
Каковы различия между структурой и классом в C ++?
Теперь я хотел бы изучить различия между структурой и классом в C ++. Пожалуйста, обсудите технические различия, а также причины выбора того или иного в дизайне ОО.
Начну с очевидной разницы:
Я уверен, что есть другие отличия, которые можно найти в неясных углах спецификации C ++.
Вы забываете хитрое 2-е различие между классами и структурами.
Quoth стандарт (§11.2.2 в C ++ 98 до C ++ 11):
И просто для полноты, более широко известное различие между классом и структурой определено в (11.2):
Дополнительное отличие: ключевое слово class может использоваться для объявления параметров шаблона, в то время как struct ключевое слово не может быть использовано таким образом.
[7.8] В чем разница между структурой ключевых слов и классом?
Члены и базовые классы структуры являются открытыми по умолчанию, в то время как в классе они по умолчанию являются закрытыми. Примечание: вы должны сделать ваши базовые классы явно общедоступными, закрытыми или защищенными, а не полагаться на значения по умолчанию.
Структура и класс в остальном функционально эквивалентны.
Ладно, хватит этого скрипучего чистого техно разговора. Эмоционально большинство разработчиков проводят четкое различие между классом и структурой. Структура просто ощущается как открытая куча битов с очень небольшим количеством способов инкапсуляции или функциональности. Класс чувствует себя живым и ответственным членом общества с интеллектуальными услугами, сильным барьером инкапсуляции и четко определенным интерфейсом. Так как это значение имеет большинство людей, вам, вероятно, следует использовать ключевое слово struct, если у вас есть класс, у которого очень мало методов и открытых данных (такие вещи существуют в хорошо спроектированных системах!), Но в противном случае вам, вероятно, следует использовать класс ключевое слово.
Стоит вспомнить происхождение C ++ и его совместимость с C.
C имеет структуры, у него нет концепции инкапсуляции, поэтому все открыто.
Публичность по умолчанию обычно считается плохой идеей при использовании объектно-ориентированного подхода, поэтому при создании формы C, которая изначально способствует OOP (вы можете сделать OO в C, но это вам не поможет), что было Идея C ++ (изначально «C With Classes»), имеет смысл сделать членов закрытыми по умолчанию.
С другой стороны, если Страуструп изменил семантику struct так, чтобы его члены были частными по умолчанию, это нарушило бы совместимость (это уже не так часто, как расходились стандарты, но все действительные программы на Си также были действительными программами на С ++, что оказало большое влияние на опору C ++).
Таким образом, class было введено новое ключевое слово, которое должно быть в точности как структура, но по умолчанию закрытое.
Если бы C ++ появился с нуля, без истории, то у него, вероятно, было бы только одно такое ключевое слово. Это также вероятно не сделало бы воздействие, которое это оказало.
В общем, люди будут склонны использовать struct, когда они делают что-то вроде того, как структуры используются в C; открытые члены, нет конструктора (если он не входит в объединение, у вас могут быть конструкторы в структурах, как в случае с классами, но люди этого не делают), нет виртуальных методов и т. д. Так как языки так же общаются с люди, читающие код для инструктажа машин (или мы будем придерживаться ассемблера и сырых кодов виртуальных машин), это хорошая идея придерживаться этого.
Какой стиль вы используете, зависит от обстоятельств и вкуса. Я обычно предпочитаю использовать struct для классов, которые имеют все данные общедоступными. Я думаю о таких классах как «не совсем правильные типы, просто структуры данных».
Функционально, нет никакой разницы, кроме государственного / частного
Однако вам нужно понимать, что это просто абстракции. Вполне возможно создать структуры, которые очень похожи на классы, а классы очень похожи на структуры. Фактически, самые ранние компиляторы C ++ были просто прекомпиляторами, которые переводят код C ++ в C. Таким образом, эти абстракции являются преимуществом для логического мышления, а не обязательно для самого компьютера.
Помимо того факта, что каждый является отдельным типом абстракции, классы предоставляют решения головоломки с именами кода на языке Си. Поскольку вы не можете иметь более одной функции с одинаковым именем, разработчики использовали шаблон _ (). например, mathlibextreme_max (). Группируя API-интерфейсы в классы, аналогичные функции (здесь мы называем их «методами») можно группировать и защищать от именования методов в других классах. Это позволяет программисту лучше организовать свой код и увеличить повторное использование кода. В теории, по крайней мере.
1) Члены класса по умолчанию являются закрытыми, а члены структуры являются открытыми по умолчанию.
Например, программа 1 не работает при компиляции, а программа 2 работает нормально.
2) При извлечении структуры из класса / структуры спецификатор доступа по умолчанию для базового класса / структуры является общедоступным. А при получении класса спецификатор доступа по умолчанию является закрытым.
Например, программа 3 завершается неудачно при компиляции, а программа 4 работает нормально.
Единственным другим отличием является наследование классов и структур по умолчанию, которое, что неудивительно, является частным и публичным соответственно.
Нет в спецификации, нет. Основное различие заключается в ожиданиях программистов, когда они читают ваш код через 2 года. структуры часто считаются POD. Структуры также используются в метапрограммировании шаблонов, когда вы определяете тип для целей, отличных от определения объектов.
Еще одна вещь, на которую следует обратить внимание: если вы обновили устаревшее приложение, в котором использовались классы, вы можете столкнуться со следующей проблемой:
Старый код имеет структуру, код был очищен, и они изменились на классы. Затем виртуальная функция или две были добавлены в новый обновленный класс.
Когда виртуальные функции находятся в классах, то внутренне компилятор добавит дополнительный указатель на данные класса, чтобы указать на функции.
Как это сломало бы старый унаследованный код, если в старом коде где-то структура была очищена с использованием memfill, чтобы очистить все это до нулей, это также вытеснит дополнительные данные указателя.
Разница между class и struct есть разница между ключевыми словами, а не между типами данных. Это два
оба определяют тип класса. Разница ключевых слов в этом контексте заключается в различном доступе по умолчанию:
Итак, еще раз: в C ++ структура идентична классу, за исключением того, что члены структуры по умолчанию имеют открытую видимость, а члены класса по умолчанию имеют закрытую видимость.
Это просто соглашение. Структуры могут быть созданы для хранения простых данных, но позже будут развиваться с добавлением функций-членов и конструкторов. С другой стороны, необычно видеть что-то кроме public: доступ в структуре.
9 классов
, В классах все члены по умолчанию являются закрытыми, но в структуре члены являются открытыми по умолчанию.
Не существует таких терминов, как конструктор и деструктор для структур, но для компилятора классов создается значение по умолчанию, если вы не предоставите.
Размер пустой структуры равен 0 байтам, поскольку размер пустого класса равен 1 байт. Тип доступа по умолчанию для структуры public. Структура обычно должна использоваться для группировки данных.
Короче говоря, соглашение состоит в том, чтобы использовать struct, когда целью является группирование данных, и использовать классы, когда нам требуется абстракция данных и, возможно, наследование.
Это означает, что если вы пишете заголовок, который хотите совместить с C, тогда у вас нет другого выбора, кроме struct (которая в мире C не может иметь функции; но может иметь указатели на функции).
√ РАССМОТРИТЕ определение структуры вместо класса, если экземпляры типа маленькие и обычно недолговечные или обычно встроены в другие объекты.
X ИЗБЕГАЙТЕ определения структуры, если тип не имеет всех следующих характеристик:
Логически представляет одно значение, похожее на примитивные типы (int, double и т. Д.).
Размер экземпляра менее 16 байт.
Это не должно быть упаковано часто.
Класс имеет смысл только в контексте разработки программного обеспечения. В контексте структур данных и алгоритмов класс и структура ничем не отличаются. Не существует каких-либо правил, ограничивающих ссылку на члена класса.
При разработке большого проекта с множеством людей без класса вы, наконец, можете получить сложный связанный код, потому что все используют любые функции и данные, которые они хотят. Класс обеспечивает контроль разрешений и свойства для улучшения разделения и повторного использования кодов.
Если вы прочитаете некоторые принципы разработки программного обеспечения, вы обнаружите, что большинство стандартов не могут быть легко реализованы без занятий. например: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29
Кстати, когда структура выделяет нехватку памяти и включает в себя несколько переменных, переменные типа значения указывают, что значения встроены в место, где размещается структура. Напротив, значения переменной ссылочного типа являются внешними и ссылаются указателем, который также встроен в то место, где размещается структура.
Разница между ключевыми словами struct и class в C ++ заключается в том, что, когда нет конкретного спецификатора для конкретного составного типа данных, то по умолчанию struct или union являются общими ключевыми словами, которые просто учитывают скрытие данных, а class являются частным ключевым словом, которое учитывает скрытие программы коды или данные. Некоторые программисты всегда используют struct для данных и class для кода. Для получения дополнительной информации свяжитесь с другими источниками.
Из всех этих факторов можно сделать вывод, что концепт-класс очень подходит для представления объектов реального мира, а не «структур». В основном потому, что концепции ООП, используемые в классе, очень практичны при объяснении сценариев реального мира, поэтому легче объединить их с реальностью. Например, наследование по умолчанию является общедоступным для структур, но если мы применяем это правило для реального мира, это смешно. Но в классе наследование по умолчанию является частным, что более реалистично.
Основное различие между структурой и ключевым словом класса в oops заключается в том, что в структуре нет открытых и закрытых объявлений членов, а член данных и функция-член могут быть определены как открытые, частные, так и защищенные.
** ОБНОВЛЕНИЕ: ** Пожалуйста, игнорируйте этот ответ. Я не рассматривал возможность того, что для структуры значение было неинициализировано, а просто оказалось равным 0. Между инициализацией структуры и класса нет различий.
Я вижу другое различие между структурами и классами, связанное с инициализацией по умолчанию.
Запустите этот код и проверьте myTester. Вы обнаружите, что для m_Foo структура m_Foo.a была инициализирована в 0, но для m_Bar класс m_Bar.a неинициализирован. Таким образом, кажется, есть разница в том, что конструктор по умолчанию делает для структуры против класса. Я вижу это с Visual Studio.
Основное различие между struct и class заключается в том, что в struct вы можете объявлять только переменные данных разных типов, в то время как в классе вы можете объявлять переменные данных, функции-члены и, таким образом, вы можете манипулировать переменными данных через функции.
Я нашел другую разницу. если вы не определили конструктор в классе, компилятор определит его. но в структуре, если вы не определяете конструктор, компилятор также не определяет конструктор. поэтому в некоторых случаях, когда нам действительно не нужен конструктор, структура является лучшим выбором (совет по производительности). и извините за мой плохой английский.
Классы являются ссылочными типами, а структуры являются типами значений.
Когда я говорю, что классы являются ссылочными типами, в
основном они будут содержать адрес переменных экземпляра.
В методе main
я могу создать экземпляр этого класса, используя оператор new, который выделяет память для этого класса
и сохраняет его базовый адрес в переменной типа MyClass (_myClassObject2).
В приведенной выше программе MyClass _myClassObject2 = _myClassObject1; инструкция указывает, что обе переменные типа MyClass
и будет указывать на ту же область памяти.
Это в основном назначает ту же самую область памяти в другую переменную того же типа.
Поэтому, если какие-либо изменения, которые мы вносим в один из объектов типа MyClass, будут влиять на другой,
поскольку оба они указывают на одну и ту же область памяти.
«_myClassObject1.DataMember = 10;» в этой строке оба элемента данных объекта будут содержать значение 10.
«_myClassObject2.DataMember = 20;» в этой строке оба элемента данных объекта будут содержать значение 20.
В конце концов, мы обращаемся к элементам данных объекта через указатели.
В отличие от классов, структуры являются типами значений. Например:
В вышеупомянутой программе
создание объекта типа MyStructure с использованием оператора new и
сохранение адреса в переменной _myStructObject типа MyStructure и
присвоение значения 10 члену данных структуры с использованием «_myStructObject1.DataMember = 10».
Поэтому любое изменение, которое мы вносим в _myStructObject1, никогда не повлияет на другую переменную _myStructObject2 типа MyStructrue.
Вот почему мы говорим, что структуры являются типами значений.
Он может быть абстрактным, запечатанным, статичным и частичным и не может быть частным, защищенным и защищенным внутри.