Клас Versus Struct


12

У C ++ та інших впливових мовах є конструкція під назвою Structure ( struct), а інша називається the class. Обидва здатні утримувати функції та змінні. Деякі відмінності:

  1. Класу дається пам’ять у купі та structнадається пам'ять у стеку (зауваження: це неправильно для C ++, але, можливо, правильно в тому, що ОП називає "впливаючими мовами")
  2. Змінна класу за замовчуванням є приватною та structє загальнодоступною

Моє запитання: structчи якось покинули Клас? Якщо так, то чому? Крім відмінностей, наведених вище, a structможе робити все те саме, що робить клас. То навіщо відмовлятися від цього?


під відмовою я мав на увазі, чому один використовується над іншим.
prometheuspk

Ваше питання відповідає на це саме я думаю.
Умаїр А.

3
Різниця між класами та структурами залежить від мови. Деякі уроки C ++ насправді не стосуються C #.
робота

6
Уххх. У C ++ ви можете виділити об'єкти в стеку або купі. Куди хочеш.
жоджо

8
Неправильно, неправильно, неправильно. Стек проти купи не має нічого спільного з різницею.
Aaronaught

Відповіді:


11

Це зовсім не кинуто. Насправді навіть сучасні мови на зразок C #, які сильно використовують, classвсе ще пропонують вам struct. Що стосується того, коли корисно вибрати один за іншим, я посилаюсь на цю статтю:

Вибір між класами та структурами

Цитується з статті MSDN:

Поміркуйте, як визначити структуру замість класу, якщо екземпляри типу невеликі і зазвичай недовговічні або зазвичай вбудовані в інші об'єкти.

Не визначайте структуру, якщо тип не має всіх наведених нижче характеристик:

  • Він логічно представляє єдине значення, подібне до примітивних типів (ціле число, подвійне і так далі).
  • Він має розмір екземпляра менше 16 байт.
  • Це незмінне.
  • Боксувати не доведеться часто.

4
Ця відповідь дійсно помилкова, оскільки значення .Net / C # struct / class відрізняється від одного C ++: вони використовують одне і те ж ім'я, але мають різний семантичний характер залежно від мови !!! У C ++ майже немає різниці між структурою та класом, і питання є абсолютно неправильним на першому пункті, що правильно в c # і D, але не в c ++. Тож посилання на цю статтю, що стосується .Net, насправді помиляється. Це не C ++!
Клаїм

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

17

Ви помиляєтесь щодо C ++: Єдина суттєва різниця між класом та структурою - різниця у специфікаторі доступу за замовчуванням. Структура і клас є синонімами всіх намірів і цілей, я вважаю, що структура зберігається для зворотної сумісності з C.


7
Не тільки. Struct - хороший вибір, коли ви просто хочете скинути купу даних в одному об’єкті і не додавати до нього жодної поведінки.
Quant_dev

2
@quant: Це жахлива причина використовувати структуру. Я дуже сподіваюсь, що коментар був язиком у щоку.
Aaronaught

1
@Aaronaught Чому? Мій погляд на використанні структури є досить стандартним, см цієї відповіді, наприклад: stackoverflow.com/questions/54585 / ...
quant_dev

1
@Aaronaught Як потім повернути кілька значень? Скажімо, нова модель повертає чисту ціну, брудну ціну та суму нарахованих платежів.
Quant_dev

1
@quant_dev - ви можете вирішити приєднати деяке метазначення до структури для своїх цілей (а для колишніх програмістів на C, що насправді має багато сенсу), але це не змінює того факту, що єдина різниця між структурою і Ключові слова класу в C ++ - це доступ за замовчуванням.
Joris Timmermans

2

мова D створила більшу різницю між класом і структурою

Структура в d - це не що інше, як виділений стеком запис даних з деякими функціями, за допомогою яких ви можете зателефонувати ( немає можливості для успадкування, якщо ви не використовуєте налаштування enum + union, тобто самостійно реалізуєте поліморфізм), який передається за значенням

клас, як ми звикли: віртуальні функції, розподіл купи, (єдине) успадкування, передані посиланнями

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.