Класс против структуры


12

В C ++ и других языках, на которые влияют, существует конструкция, которая называется Structure ( struct), а другая называется class. Оба способны содержать функции и переменные. Некоторые различия:

  1. Классу дается память в куче и structдается память в стеке (примечание: это неправильно для C ++, но может быть правильным в том, что в OP называлось «языками влияния»)
  2. Переменные класса являются приватными по умолчанию и structявляются публичными

Мой вопрос: был ли кто- structто заброшен для класса? Если так, то почему? Кроме указанных выше различий, a structможет делать все то же, что и класс. Так зачем отказываться от этого?


Я отказался от того, почему один используется над другим.
prometheuspk

Ваш вопрос отвечает на это сам, я думаю.
Умайр А.

3
Разница между классами и структурами зависит от языка. Некоторые уроки из C ++ на самом деле не относятся к C #.
Работа

6
Uhhhh. В C ++ вы можете размещать объекты в стеке или куче. Где угодно.
Jojo

8
Неправильно, неправильно, неправильно. Стек против кучи не имеет никакого отношения к разнице.
Ааронаут

Ответы:


11

Это не заброшено вообще. На самом деле, даже современные языки, такие как C #, которые интенсивно используют, classвсе еще предлагают вам struct. Что касается того, когда полезно выбрать одно из другого, я отсылаю вас к этой статье:

Выбор между классами и структурами

Цитируется из статьи MSDN:

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

Не определяйте структуру, если тип не имеет всех следующих характеристик:

  • Он логически представляет одно значение, похожее на примитивные типы (целое, двойное и т. Д.).
  • Размер экземпляра меньше 16 байт.
  • Это неизменно.
  • Это не должно быть упаковано часто.

4
Этот ответ действительно ошибочен, так как .Net / C # struct / class отличается от C ++: они используют одно и то же имя, но имеют различную семантику в зависимости от языка !!! В C ++ почти нет различий между struct и class, и вопрос по первому пункту совершенно неверен, что верно в c # и D, но не в c ++. Так что ссылка на эту статью, посвященную .Net, действительно неверна. Это не C ++!
Klaim

Технически @Klaim также не подходит для C # (структуры могут быть в куче). Важное различие в C # заключается в семантике значений и ссылочной семантике, различие, в котором C ++ не нуждается, поскольку он может иметь значения или ссылки для чего угодно
jk.

17

Вы ошибаетесь в C ++: единственное существенное различие между классом и структурой - это разница в спецификаторах доступа по умолчанию. Struct и class для всех намерений и целей являются синонимами, я считаю, что struct сохраняется для обратной совместимости с C.


7
Не только. Struct - хороший выбор, когда вы просто хотите свалить кучу данных в один объект и не добавлять к нему никакого поведения.
Quant_dev

2
@quant: Это ужасная причина использовать структуру. Я действительно надеюсь, что комментарий был насмешливым.
Ааронаут

1
@ Aaronaught Почему? Мой взгляд на использование struct довольно стандартен, см. Этот ответ, например: stackoverflow.com/questions/54585/…
quant_dev

1
@Aaronaught Как вы возвращаете несколько значений тогда? Скажем, модель обработки возвращает чистую цену, грязную цену и сумму начисленных платежей.
quant_dev

1
@quant_dev - вы можете решить добавить некоторый мета-смысл в структуру для ваших целей (и для бывших программистов на С, которая действительно имеет большой смысл), но это не меняет того факта, что единственная разница между структурой и Ключевые слова класса в C ++ - доступ по умолчанию.
Йорис Тиммерманс

2

язык D создал большее различие между классом и структурой

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

класс, к которому мы привыкли: виртуальные функции, выделение кучи, (одиночное) наследование, переданное ref

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.