Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 1 / 1
Регистрация: 15.09.2025
Сообщений: 49

В чем преимущество Структур над Классами?

20.09.2025, 07:54. Показов 2876. Ответов 18

Студворк — интернет-сервис помощи студентам
Добрый день.

Тема исследуется, и скорее всего - это сложный вопрос: В современных С++ в чем преимущество struct над class?

Спасибо.
---------
Ответа я не знаю, и специально выделил слова, чтоб обозначить направление поиска. Возможно, дополнительный вопрос поможет понять смысл:
C++
1
2
3
4
5
6
7
struct OldStruct
{
};
 
class NewStruct
{public:
};
Какие функциональные различия между OldStruct и NewStruct ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2025, 07:54
Ответы с готовыми решениями:

Ссылки и указатели - в чем преимущество одного над другим
Известно, что главной причиной появления ссылок в С++ было дать более безопасную альтернативу...

В чем преимущество list над вектором?
В чем преимущество list над вектором?

В чем преимущество trampoline hook над обычным hook?
Объясните пожалуйста в чем преимущество trampoline hook и hook? Никак не могу понять

18
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
20.09.2025, 08:20
Лучший ответ Сообщение было отмечено SmallEvil как решение

Решение

JordanO2, разница только в спецификаторе доступа по умолчанию (для элементов и при наследовании). Больше отличий нет

Добавлено через 51 секунду
Цитата Сообщение от JordanO2 Посмотреть сообщение
В современных С++
и с самого начала так было
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6102 / 2795 / 1037
Регистрация: 01.06.2021
Сообщений: 10,217
20.09.2025, 10:35
Если про современный С++, то

C.2: Use class if the class has an invariant; use struct if the data members can vary independently
https://isocpp.github.io/CppCo... ependently

C.8: Use class rather than struct if any member is non-public
https://isocpp.github.io/CppCo... non-public
0
-610 / 35 / 0
Регистрация: 10.03.2025
Сообщений: 484
20.09.2025, 11:49
А я то думал, что класс создает новый объект, а структура типа небольшой базы или списка
типа список дней недели, месяцев в году
0
Модератор
Эксперт Java
 Аватар для alecss131
2835 / 1344 / 403
Регистрация: 11.08.2017
Сообщений: 4,297
Записей в блоге: 2
20.09.2025, 12:16
Цитата Сообщение от JordanO2 Посмотреть сообщение
Какие функциональные различия между OldStruct и NewStruct ?
В приведенном коде никаких, ну для классов получается писать чуть больше кода.

Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
то
Это все же рекомендации по использованию, а не различия. В плане функционала что структура, что класс с пабликом на все ведут себя идентично.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6102 / 2795 / 1037
Регистрация: 01.06.2021
Сообщений: 10,217
20.09.2025, 12:27
Цитата Сообщение от avedeo Посмотреть сообщение
типа список дней недели, месяцев в году
такое уже есть в стандартной библиотеке https://en.cppreference.com/w/cpp/chrono/c/tm.html

std::tm - это структура, состоящая из 9 или 11 членов-переменных. Такие структуры еще называются POD-структурами - (Plain Old Data). Они совместимы с языком С, эффективно используют память, быстро инициализируются и копируются, легко сериализуются и десериализуются, в том числе удобны для работы с бинарными данными, хорошо оптимизируются компиляторами.

Но в С++ структуры бывают не только такими. По возможностям, они фактически ничем не отличаются от классов.

Добавлено через 2 минуты
Цитата Сообщение от alecss131 Посмотреть сообщение
Это все же рекомендации по использованию, а не различия.
ну я про рекомендации и писал. Про различия Алексей1153 уже ответил выше, что тут уже добавлять?
1
Заблокирован
20.09.2025, 16:09
Во первых: struct - это елемент совместимости с ЯП Си.
Второе, есть некоторые отличия поведенческие отличия, о всех лучше читать в стандарте.
Но вот тебе пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
struct SA{
   int a{};
};
struct SB : SA{};
struct SC : SB{};
 
class CA{
public:
   int a{};
};
class CB : CA{};
class CC : CB{};
 
int main(){
    std::cout << SC().a;
    std::cout << CC().a;
}
Но как ответили самым первым постом, принципиальной разницы нет.
http://en.cppreference.com/w/c... class.html
class-key - one of class, struct and union. The keywords class and struct are identical except for the default member access and the default base class access. If it is union, the declaration introduces a union type.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6102 / 2795 / 1037
Регистрация: 01.06.2021
Сообщений: 10,217
20.09.2025, 17:13
JordanO2, если у них единственное отличие "в спецификаторе доступа по умолчанию (для элементов и при наследовании)", то какие могут быть преимущества у одного перед другим?

Именно, поэтому может возникнуть вопрос, а что использовать в том или ином случае, если они мало чем отличаются? Ну чтобы немного помочь в этом направлении я привел рекомендации В чем преимущество Структур над Классами? Следовать им или нет - это уже твое дело. Но они написаны создателем языка С++ и секретарем комитета по стандартизации WG21.
0
2 / 1 / 1
Регистрация: 15.09.2025
Сообщений: 49
20.09.2025, 17:35  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
то какие могут быть преимущества у одного перед другим?
Вот именно. Про преимущества был вопрос. Тут же форум программистов.
И более того, в "лучшем ответе" (не на тот вопрос) видно, что упущена неожиданная особенность языка С++. И именно слово "преимущество" не дает ошибиться. Я сам только сейчас узнал.
0
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
20.09.2025, 17:36
JordanO2, нет никаких преимуществ
0
Заблокирован
20.09.2025, 18:00
Цитата Сообщение от JordanO2 Посмотреть сообщение
В правильном ответе должно присутствовать слово - "преимущество" (а не различия).
Тебе никто тут ничего не должен, это раз.
Два, ещё раз, не давай оценку другим и не навязывай своё восприятие другим.
И жизнь станет приятней.
А до тех пор...
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
21.09.2025, 12:34
Цитата Сообщение от Алексей1153 Посмотреть сообщение
JordanO2, нет никаких преимуществ
На мой взгляд только одно - совместимость с Си.
Например гуглим заголовок BMP-формата, сразу натыкаемся на СИшный - тупо копипастим в свой код и далее уже можем его использовать где угодно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6102 / 2795 / 1037
Регистрация: 01.06.2021
Сообщений: 10,217
21.09.2025, 13:12
Цитата Сообщение от drfaust Посмотреть сообщение
На мой взгляд только одно - совместимость с Си.
Например гуглим заголовок BMP-формата, сразу натыкаемся на СИшный - тупо копипастим в свой код и далее уже можем его использовать где угодно.
Это очень сомнительное преимущество.
Это может быть преимуществом, когда мы хотим использовать плюсовый код в коде на С. Ведь, если мы даже натыкаемся на сишные коды со структурами, то они все равно будут без проблем работать в плюсовом коде. То есть, это "преимущество" только в случае использования плюсового кода в коде С, а не наоборот. Однако, при использовании плюсового кода на С, не думаю, что структуры/классы будут единственной проблемой, там придется все равно сделать немало правок, возможно, даже писать с нуля (в случае, если код написан на современном С++).
0
1184 / 460 / 68
Регистрация: 22.09.2023
Сообщений: 1,398
21.09.2025, 16:10
Цитата Сообщение от JordanO2 Посмотреть сообщение
Вот именно. Про преимущества был вопрос.
Это был вопрос из серии "вы уже перестали бить жену по утрам, да или нет?" То есть другие (правильные) варианты ответа не допускаются в принципе. А тем не менее правильный ответ совсем другой и он тут был неоднократно озвучен: "никаких преимуществ нет".
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
21.09.2025, 20:24
Интересно классу не будет плохо если его обернут в #pragma pack 1 например.
0
Заблокирован
21.09.2025, 20:45
Цитата Сообщение от Aledveu Посмотреть сообщение
Интересно классу не будет плохо если его обернут в #pragma pack 1 например.
Майкрософт говорит что нет.
Цитата Сообщение от https://learn.microsoft.com/ru-ru/cpp/preprocessor/pack?view=msvc-170
Указывает выравнивание упаковки для элементов структуры, объединения и класса.
GCC тоже:
Цитата Сообщение от https://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Structure_002dPacking-Pragmas.html
For compatibility with Microsoft Windows compilers, GCC supports a set of #pragma directives which change the maximum alignment of members of structures (other than zero-width bitfields), unions, and classes subsequently defined. The n value below always is required to be a small power of two and specifies the new alignment in bytes.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6102 / 2795 / 1037
Регистрация: 01.06.2021
Сообщений: 10,217
21.09.2025, 20:59
Цитата Сообщение от Aledveu Посмотреть сообщение
#pragma pack
хоть и это поддерживается практически всеми компиляторами, это не является частью ISO C++

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

А для работы с бинарными данными для сериализации данных есть куча других способов
0
Модератор
Эксперт Java
 Аватар для alecss131
2835 / 1344 / 403
Регистрация: 11.08.2017
Сообщений: 4,297
Записей в блоге: 2
21.09.2025, 21:29
Цитата Сообщение от Royal_X Посмотреть сообщение
А для работы с бинарными данными для сериализации данных есть куча других способов
Ага, особенно когда работаешь с уже готовыми данными (которые без выравнивания хранятся) и читаешь их через стримы, без прагмы-пак никак не обойтись.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6102 / 2795 / 1037
Регистрация: 01.06.2021
Сообщений: 10,217
21.09.2025, 22:08
Цитата Сообщение от alecss131 Посмотреть сообщение
Ага, особенно когда работаешь с уже готовыми данными (которые без выравнивания хранятся) и читаешь их через стримы, без прагмы-пак никак не обойтись.
ну тут, да, использование оправдано, ведь ты не контролируешь формат данных, а остается следовать ему

но в остальных случаях это антипаттерн
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2025, 22:08
Помогаю со студенческими работами здесь

В чем преимущество ReadFileEx/WriteFileEx над асинхронными версиями ReadFile/WriteFile
Мое почтение, джентльмены. Протестировал данные функции в асинхронном режиме, в скорости не...

В чем преимущество рекурсивных функций?
Насколько я понял, любую рекурсивную функцию можно реализовать итерационно. И при этом,...

В чем преимущество использования Pimpl?
Есть две реализации одной лабораторной. Первая с закрытым наследованием, вторая с использованием...

В чем преимущество приложений на С
В чём собственно особенность написание программ на С?Вить всё равно мы используем WINAPI,за что так...

В чем основное преимущество разделяемой памяти
Подскажите в чем основное преимуществоразделяемой памяти


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru