Этот вопрос уже задавался в контексте C # /. Net .
Теперь я хотел бы изучить различия между структурой и классом в C ++. Пожалуйста, обсудите технические различия, а также причины выбора того или иного в дизайне ОО.
Начну с очевидной разницы:
- Если вы не укажете
public:
илиprivate:
, члены структуры будут по умолчанию открытыми; члены класса являются частными по умолчанию.
Я уверен, что есть другие отличия, которые можно найти в неясных углах спецификации C ++.
struct
C и C ++? Смотрите здесь .struct
означает C ++. ;) Но нет причины, по которой вы не можете использовать этоclass
ключевое слово.Ответы:
Вы забываете хитрое 2-е различие между классами и структурами.
Quoth стандарт (§11.2.2 в C ++ 98 до C ++ 11):
И просто для полноты, более широко известное различие между классом и структурой определено в (11.2):
Дополнительное отличие: ключевое слово
class
может использоваться для объявления параметров шаблона, в то время какstruct
ключевое слово не может быть использовано таким образом.источник
class
, public по умолчанию сstruct
, и оба определяют тип класса.struct
иclass
заключается в том, что последний может использоваться вместо atypename
для объявления параметра шаблона, а первый - нет.:)
Цитируя C ++ FAQ ,
источник
Стоит вспомнить происхождение C ++ и его совместимость с C.
C имеет структуры, у него нет концепции инкапсуляции, поэтому все открыто.
Публичность по умолчанию обычно считается плохой идеей при использовании объектно-ориентированного подхода, поэтому при создании формы C, которая изначально способствует OOP (вы можете сделать OO в C, но это вам не поможет), что было Идея C ++ (изначально «C With Classes»), имеет смысл сделать членов закрытыми по умолчанию.
С другой стороны, если Страуструп изменил семантику
struct
так, чтобы его члены были частными по умолчанию, это нарушило бы совместимость (это уже не так часто, как расходились стандарты, но все действительные программы на Си также были действительными программами на С ++, что оказало большое влияние на опору C ++).Таким образом,
class
было введено новое ключевое слово, которое должно быть в точности как структура, но по умолчанию закрытое.Если бы C ++ появился с нуля, без истории, то у него, вероятно, было бы только одно такое ключевое слово. Это также вероятно не сделало бы воздействие, которое это оказало.
В общем, люди будут склонны использовать struct, когда они делают что-то вроде того, как структуры используются в C; открытые члены, нет конструктора (если он не входит в объединение, у вас могут быть конструкторы в структурах, как в случае с классами, но люди этого не делают), нет виртуальных методов и т. д. Так как языки так же общаются с люди, читающие код для инструктажа машин (или мы будем придерживаться ассемблера и сырых кодов виртуальных машин), это хорошая идея придерживаться этого.
источник
struct
внутреннего*.c
-файла и позволить другим модулям перевода использовать его только с указателем. Таким образом, у вас есть еще более сильная инкапсуляция, потому что другие единицы перевода даже не знают, что находится внутриstruct
.Члены класса по умолчанию являются закрытыми. Члены Struct являются публичными по умолчанию. Кроме того, нет никаких других отличий. Также смотрите этот вопрос .
источник
struct
и другоеclass
объявляет класс с идентичной семантикой (несмотря на синтаксическую интерпретацию тела определения).Согласно Страуструпу на языке программирования C ++ :
Функционально, нет никакой разницы, кроме государственного / частного
источник
STRUCT - это тип абстрактного типа данных, который разделяет данный фрагмент памяти в соответствии со спецификацией структуры. Структуры особенно полезны при сериализации / десериализации файлов, поскольку структуру часто можно записать в файл дословно. (т.е. получить указатель на структуру, используйте макрос SIZE, чтобы вычислить количество копируемых байтов, а затем переместите данные в или из структуры.)
Классы - это другой тип абстрактного типа данных, который пытается обеспечить скрытие информации. Внутренне могут быть различные махинации, методы, временные переменные, переменные состояния. и т. д., которые все используются для представления согласованного API для любого кода, который хочет использовать класс.
По сути, структуры - это данные, классы - это код.
Однако вам нужно понимать, что это просто абстракции. Вполне возможно создать структуры, которые очень похожи на классы, а классы очень похожи на структуры. Фактически, самые ранние компиляторы C ++ были просто прекомпиляторами, которые переводят код C ++ в C. Таким образом, эти абстракции являются преимуществом для логического мышления, а не обязательно для самого компьютера.
Помимо того факта, что каждый является отдельным типом абстракции, классы предоставляют решения головоломки с именами кода на языке Си. Поскольку вы не можете иметь более одной функции с одинаковым именем, разработчики использовали шаблон _ (). например, mathlibextreme_max (). Группируя API-интерфейсы в классы, аналогичные функции (здесь мы называем их «методами») можно группировать и защищать от именования методов в других классах. Это позволяет программисту лучше организовать свой код и увеличить повторное использование кода. В теории, по крайней мере.
источник
struct
ключевого слова.struct
объявляет классы (включаяpublic
/private
/protected
, наследование и т. Д.).SIZE
макрос, о котором ты говоришь?1) Члены класса по умолчанию являются закрытыми, а члены структуры являются открытыми по умолчанию.
Например, программа 1 не работает при компиляции, а программа 2 работает нормально.
2) При извлечении структуры из класса / структуры спецификатор доступа по умолчанию для базового класса / структуры является общедоступным. А при получении класса спецификатор доступа по умолчанию является закрытым.
Например, программа 3 завершается неудачно при компиляции, а программа 4 работает нормально.
источник
Единственным другим отличием является наследование классов и структур по умолчанию, которое, что неудивительно, является частным и публичным соответственно.
источник
Это на VS2005.
источник
_tmain
не является стандартным C ++.Нет в спецификации, нет. Основное различие заключается в ожиданиях программистов, когда они читают ваш код через 2 года. структуры часто считаются POD. Структуры также используются в метапрограммировании шаблонов, когда вы определяете тип для целей, отличных от определения объектов.
источник
Еще одна вещь, на которую следует обратить внимание: если вы обновили устаревшее приложение, в котором использовались классы, вы можете столкнуться со следующей проблемой:
Старый код имеет структуру, код был очищен, и они изменились на классы. Затем виртуальная функция или две были добавлены в новый обновленный класс.
Когда виртуальные функции находятся в классах, то внутренне компилятор добавит дополнительный указатель на данные класса, чтобы указать на функции.
Как это сломало бы старый унаследованный код, если в старом коде где-то структура была очищена с использованием memfill, чтобы очистить все это до нулей, это также вытеснит дополнительные данные указателя.
источник
calloc
в пользуnew
. Все, что можно сделать, - это убедиться, что любые структуры, используемые частью кода C, на самом деле являются PODS.Член класса, определенного с ключевым словом
class
,private
по умолчанию. Члены класса, определенного с помощью ключевых словstruct
(илиunion
), являютсяpublic
по умолчанию.При отсутствии спецификатора доступа для базового класса
public
предполагается, когда производный класс объявлен,struct
иprivate
предполагается, когда класс объявленclass
.Вы можете объявить,
enum class
но неenum struct
.Вы можете использовать,
template<class T>
но неtemplate<struct T>
.Также обратите внимание, что стандарт C ++ позволяет вам заранее объявить тип как a
struct
, а затем использовать егоclass
при объявлении типа и наоборот. Кроме того ,std::is_class<Y>::value
этоtrue
для Y бытьstruct
иclass
, ноfalse
дляenum class
.источник
struct
иclass
в c ++ - это разница между ключевыми словами, а не между типами данных (или какой-то лучшей альтернативой;)std::is_class<Y>::value
покрывает?Разница между
class
иstruct
есть разница между ключевыми словами, а не между типами данных. Это дваоба определяют тип класса. Разница ключевых слов в этом контексте заключается в различном доступе по умолчанию:
foo::x
является публичным иfoo_base
наследуется публичноbar::x
является частным иbar_base
наследуется в частном порядкеисточник
Вот хорошее объяснение: http://carcino.gen.nz/tech/cpp/struct_vs_class.php
источник
Это просто соглашение. Структуры могут быть созданы для хранения простых данных, но позже будут развиваться с добавлением функций-членов и конструкторов. С другой стороны, необычно видеть что-то кроме public: доступ в структуре.
источник
источник
Другое главное отличие - в том, что касается шаблонов. Насколько я знаю, вы можете использовать класс, когда определяете шаблон, но НЕ структуру.
источник
struct
не допускается там просто соглашением (лучше сказать, что этоclass
ключевое слово, которое используется в другом смысле здесь, см. Использование 'class' или 'typename' для параметров шаблона ).struct
просто отлично. Просто попробуйте.struct T{}; template <typename T> void foo() {} foo<T>();
В других ответах упоминались частные / публичные значения по умолчанию (но обратите внимание, что структура - это класс, это структура; это не два разных элемента, а два способа определения одного и того же элемента).
Что может быть интересно отметить (особенно потому, что спрашивающий, вероятно, будет использовать MSVC ++, поскольку он упоминает «неуправляемый» C ++), - это то, что Visual C ++ жалуется при определенных обстоятельствах, если класс объявляется
class
и затем определяется сstruct
(или, возможно, наоборот) ), хотя стандарт гласит, что это совершенно законно.источник
, В классах все члены по умолчанию являются закрытыми, но в структуре члены являются открытыми по умолчанию.
Не существует таких терминов, как конструктор и деструктор для структур, но для компилятора классов создается значение по умолчанию, если вы не предоставите.
Размер пустой структуры равен 0 байтам, поскольку размер пустого класса равен 1 байт. Тип доступа по умолчанию для структуры public. Структура обычно должна использоваться для группировки данных.
Тип доступа по умолчанию для класса является закрытым, а режим по умолчанию для наследования - закрытым. Класс должен использоваться для группировки данных и методов, которые работают с этими данными.
Короче говоря, соглашение состоит в том, чтобы использовать struct, когда целью является группирование данных, и использовать классы, когда нам требуется абстракция данных и, возможно, наследование.
В C ++ структуры и классы передаются по значению, если явно не обращены ссылки. В других языках классы и структуры могут иметь различную семантику - т.е. объекты (экземпляры классов) могут передаваться по ссылке, а структуры - по значению. Примечание. Есть комментарии, связанные с этим вопросом. Смотрите страницу обсуждения, чтобы добавить к разговору.
источник
g++
. Возможно, вы думаете об Оптимизации пустой базы, но это относится и к обоим.struct
создает полноценные классы в C ++.Хотя это подразумевается другими ответами, прямо не упоминается - что структуры совместимы с C, в зависимости от использования; классы нет.
Это означает, что если вы пишете заголовок, который хотите совместить с C, тогда у вас нет другого выбора, кроме struct (которая в мире C не может иметь функции; но может иметь указатели на функции).
источник
Вы можете подумать об этом, чтобы узнать, когда следует использовать struct или class, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .
источник
Класс имеет смысл только в контексте разработки программного обеспечения. В контексте структур данных и алгоритмов класс и структура ничем не отличаются. Не существует каких-либо правил, ограничивающих ссылку на члена класса.
При разработке большого проекта с множеством людей без класса вы, наконец, можете получить сложный связанный код, потому что все используют любые функции и данные, которые они хотят. Класс обеспечивает контроль разрешений и свойства для улучшения разделения и повторного использования кодов.
Если вы прочитаете некоторые принципы разработки программного обеспечения, вы обнаружите, что большинство стандартов не могут быть легко реализованы без занятий. например: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29
Кстати, когда структура выделяет нехватку памяти и включает в себя несколько переменных, переменные типа значения указывают, что значения встроены в место, где размещается структура. Напротив, значения переменной ссылочного типа являются внешними и ссылаются указателем, который также встроен в то место, где размещается структура.
источник
struct
объявляет классы (включая управление разрешениями, наследование и т. Д.).Разница между ключевыми словами struct и class в C ++ заключается в том, что, когда нет конкретного спецификатора для конкретного составного типа данных, то по умолчанию struct или union являются общими ключевыми словами, которые просто учитывают скрытие данных, а class являются частным ключевым словом, которое учитывает скрытие программы коды или данные. Некоторые программисты всегда используют struct для данных и class для кода. Для получения дополнительной информации свяжитесь с другими источниками.
источник
struct
члены по умолчанию являются публичными, а в принятом ответе от 2009 года упоминается наследование. Зачем писать еще один ответ, который не добавляет новой информации через 4 года?Из всех этих факторов можно сделать вывод, что концепт-класс очень подходит для представления объектов реального мира, а не «структур». В основном потому, что концепции ООП, используемые в классе, очень практичны при объяснении сценариев реального мира, поэтому легче объединить их с реальностью. Например, наследование по умолчанию является общедоступным для структур, но если мы применяем это правило для реального мира, это смешно. Но в классе наследование по умолчанию является частным, что более реалистично.
В любом случае, что мне нужно обосновать, так это то, что Класс - это гораздо более широкое понятие, применимое к реальному миру, тогда как Структура - это примитивная Концепция с плохой внутренней организацией (хотя структура Eventhough следует концепциям ООП, они имеют плохое значение)
источник
Основное различие между структурой и ключевым словом класса в oops заключается в том, что в структуре нет открытых и закрытых объявлений членов, а член данных и функция-член могут быть определены как открытые, частные, так и защищенные.
источник
struct
объявляет классы (включаяpublic
/private
/protected
, наследование и т. Д.).** ОБНОВЛЕНИЕ: ** Пожалуйста, игнорируйте этот ответ. Я не рассматривал возможность того, что для структуры значение было неинициализировано, а просто оказалось равным 0. Между инициализацией структуры и класса нет различий.
Я вижу другое различие между структурами и классами, связанное с инициализацией по умолчанию.
Запустите этот код и проверьте myTester. Вы обнаружите, что для m_Foo структура m_Foo.a была инициализирована в 0, но для m_Bar класс m_Bar.a неинициализирован. Таким образом, кажется, есть разница в том, что конструктор по умолчанию делает для структуры против класса. Я вижу это с Visual Studio.
источник
m_Foo.a
было инициализировано? Что, если он был неинициализирован и просто оказался0
?Основное различие между struct и class заключается в том, что в struct вы можете объявлять только переменные данных разных типов, в то время как в классе вы можете объявлять переменные данных, функции-члены и, таким образом, вы можете манипулировать переменными данных через функции.
-> Еще одна удобная вещь, которую я нахожу в классе против структуры, состоит в том, что при реализации файлов в программе, если вы хотите снова и снова выполнять некоторые операции над структурой для каждого нового набора операций, вам нужно создать отдельную функцию и вам нужно передать объект структуры после чтения его из файла, чтобы выполнить с ним некоторые операции. в то время как в классе, если вы делаете функцию, которая выполняет некоторые операции с данными, необходимыми каждый раз ... это просто, вы просто должны прочитать объект из файла и вызвать функцию ..
Но это зависит от программиста, какой путь он / она находит подходящим ... по моему мнению, я предпочитаю класс каждый раз только потому, что он поддерживает ООП, и поэтому он реализован почти на всех языках и является замечательной особенностью программирования всех времен; )
И да, самое незабытое различие, которое я забыл упомянуть, заключается в том, что класс поддерживает скрытие данных, а также поддерживает операции, выполняемые над встроенными типами данных, а struct - нет!
источник
struct
могут быть функции-членыstruct
может иметь конструкторы, функцию-член и распределитель (возможно, виртуальный, возможно частный, защищенный или общедоступный). Они могут наследовать и наследоваться. так на самом деле ... все, что может иметь класс. Типичное соглашение - объявлять через struct то, что вы бы объявили как struct в C и как класс, если мы объявим приватную и защищенную переменную, виртуальные функции, ctor и dtor и так далее. Но это просто соглашение, не соблюдаемое языкомЯ нашел другую разницу. если вы не определили конструктор в классе, компилятор определит его. но в структуре, если вы не определяете конструктор, компилятор также не определяет конструктор. поэтому в некоторых случаях, когда нам действительно не нужен конструктор, структура является лучшим выбором (совет по производительности). и извините за мой плохой английский.
источник
struct
ключевым словом, и классом, определенным сclass
ключевым словом.Классы являются ссылочными типами, а структуры являются типами значений.
Когда я говорю, что классы являются ссылочными типами, в
основном они будут содержать адрес переменных экземпляра.
Например:
В методе 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».
В следующей строке
я объявляю другую переменную _myStructObject2 типа MyStructure и назначаю в нее _myStructObject1.
Здесь компилятор .NET C # создает еще одну копию объекта _myStructureObject1 и
назначает эту ячейку памяти в переменную MyStructure _myStructObject2.
Поэтому любое изменение, которое мы вносим в _myStructObject1, никогда не повлияет на другую переменную _myStructObject2 типа MyStructrue.
Вот почему мы говорим, что структуры являются типами значений.
Поэтому непосредственным базовым классом для класса является Object, а непосредственным базовым классом для Structure является ValueType, который наследуется от Object.
Классы будут поддерживать наследование, а структуры - нет.
Как мы говорим это?
И в чем причина этого?
Ответ - Классы.
Он может быть абстрактным, запечатанным, статичным и частичным и не может быть частным, защищенным и защищенным внутри.
источник
struct
иclass
. Никто здесь не упомянул об этом, ни весь веб. Так что я не думаю, что это относится и к C ++.int a = 3; int b = a;
и тому подобноеMyStruct a=MyStruct("data"); MyStruct b = a;
Есть 3 основных различия между структурой и классом
1St-память зарезервированы для структуры в стековой памяти (которая близка к языку программирования), зарезервированы ли для класса в стековой памяти только референция, а фактическая память зарезервирована в кучной памяти.
2Nd - по умолчанию структура считается общедоступной, а класс - частным.
3Rd - не может повторно использовать код в структуре, но в классе мы можем повторно использовать один и тот же код много раз, называемый наследованием
источник