Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отличие Class от Struct / 25 сообщений из 26, страница 1 из 2
24.05.2018, 20:05
    #39649579
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
На первый взгляд почти идентичны ?

Когда правильно использовать Class а когда Struct ?
...
Рейтинг: 0 / 0
24.05.2018, 20:25
    #39649581
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
semen.s.semen,

Нет никакой разницы кроме того что в struct все члены по умолчанию public, а в class - по умолчанию private.
...
Рейтинг: 0 / 0
24.05.2018, 20:27
    #39649582
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
struct удобно использовать когда у вас код в стиле C - т.е. нет методов/конструкторов.
...
Рейтинг: 0 / 0
24.05.2018, 21:26
    #39649593
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Anatoly Moskovsky, есть еще одно небольшое отличие - присутствие/отсутствие по умолчанию указателя на VTBL.
...
Рейтинг: 0 / 0
24.05.2018, 21:29
    #39649594
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devAnatoly Moskovsky, есть еще одно небольшое отличие - присутствие/отсутствие по умолчанию указателя на VTBL.

Расскажите плиз по подробнее
...
Рейтинг: 0 / 0
24.05.2018, 21:41
    #39649597
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Anatoly Moskovskystruct удобно использовать когда у вас код в стиле C - т.е. нет методов/конструкторов.
Или когда трейты/метафункции пишешь
...
Рейтинг: 0 / 0
24.05.2018, 21:58
    #39649598
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devAnatoly Moskovsky, есть еще одно небольшое отличие - присутствие/отсутствие по умолчанию указателя на VTBL.
Если виртуальных методов нет - никакой VTBL не создаётся
...
Рейтинг: 0 / 0
24.05.2018, 21:59
    #39649599
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devесть еще одно небольшое отличие - присутствие/отсутствие по умолчанию указателя на VTBL.
Нет такого.
...
Рейтинг: 0 / 0
24.05.2018, 22:42
    #39649603
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Anatoly Moskovsky, да... Похоже, я забыл о реальном назначении и причинах использования __declspec(novtable) .
Каюсь, был неправ!
...
Рейтинг: 0 / 0
25.05.2018, 00:13
    #39649621
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Anatoly Moskovskystruct удобно использовать когда у вас код в стиле C - т.е. нет методов/конструкторов.или наоборот, когда нет данных, а все методы - публичные и, возможно, абстрактные
...
Рейтинг: 0 / 0
25.05.2018, 10:41
    #39649733
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Anatoly Moskovskysemen.s.semen,

Нет никакой разницы кроме того что в struct все члены по умолчанию public, а в class - по умолчанию private.

Есть ещё одно отличие -- наследование от предков в struct по умолчанию public , в class по умолчанию private .

Т.е. в struct можно не писать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class ParentCl;

// ...

struct ChildStruct : /* public */ ParentCl // public тут можно опустить.
{
// ...
};
...
Рейтинг: 0 / 0
25.05.2018, 10:45
    #39649738
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devAnatoly Moskovsky, есть еще одно небольшое отличие - присутствие/отсутствие по умолчанию указателя на VTBL.

Нет, такого отличия нет. Указатель на vtbl в любом классе или структуре появляется только с появлением хотя бы одного
виртуального метода в иерархии. Такие классы/структуры с указателем на vtbl называются полиморфными классами,
а без него -- неполиморфными. И они отличаются друг от друга в частности ещё и возможностью применения к ним RTTI и
dynamic_cast.
...
Рейтинг: 0 / 0
25.05.2018, 11:07
    #39649760
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
MasterZiv, меня сбила с толку память о наличии __declspec(novtable). Забыл, что обычно эту директиву применяют к чисто абстрактным классам.
...
Рейтинг: 0 / 0
25.05.2018, 11:22
    #39649777
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devMasterZiv, меня сбила с толку память о наличии __declspec(novtable). Забыл, что обычно эту директиву применяют к чисто абстрактным классам.

Во-первых, это не стандарт, а расширение какое-то, во-вторых, как же абстрактному классу-то и без vtable ?

P.S. почитал про это -- вообще хрень какая-то... Но и потом -- оно НЕ удаляет vtable, она удаляет лишь использование этого vtable (инициализацию указателя) из конструктора и деструктора.
...
Рейтинг: 0 / 0
25.05.2018, 12:42
    #39649840
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Anatoly Moskovskysemen.s.semen,

Нет никакой разницы кроме того что в struct все члены по умолчанию public, а в class - по умолчанию private.
Можно разве что дополнить. Еще есть union, у него тоже по молчанию public как и у struct. И тоже могут быть и методы, и виртуальные и т.д.
...
Рейтинг: 0 / 0
25.05.2018, 13:05
    #39649850
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
MasterZivВо-первых, это не стандарт, а расширение какое-то, во-вторых, как же абстрактному классу-то и без vtable ?

P.S. почитал про это -- вообще хрень какая-то... Но и потом -- оно НЕ удаляет vtable, она удаляет лишь использование этого vtable (инициализацию указателя) из конструктора и деструктора.Так нафига абстрактному классу иметь таблицу виртуальных методов, если он никогда не инстанцируется, а используется исключительно для описания интерфейса и наследования? Компилятору достаточно знать только порядок объявлениях виртуальных методов этого класса, а vtable ему без надобности.
...
Рейтинг: 0 / 0
25.05.2018, 13:31
    #39649874
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devКомпилятору достаточно знать только порядок объявлениях виртуальных методов этого класса, а vtable ему без надобности.Насколько я знаю, никто не запрещает иметь реализацию метода в абстрактном классе.
И, насколько я понимаю, как минимум, деструктор абстрактного класса будет виртуальным.

P.S.
Оголтелая оптимизанщина - тревожный звоночек.
...
Рейтинг: 0 / 0
25.05.2018, 14:16
    #39649927
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Basil A. SidorovНасколько я знаю, никто не запрещает иметь реализацию метода в абстрактном классе.
И, насколько я понимаю, как минимум, деструктор абстрактного класса будет виртуальным.Иметь реализацию виртуального деструктора, конечно можно - никто не запрещает... Но если класс исключительно интерфейсный, то занафига она нужна? Предположим, у тебя пол сотни виртуальных методов (я, конечно, прикалываюсь) и размещение vtable на моделях ILP64/LP64/LLP64 добавит к бинарному модулю почти пол килобайта. А если таких интерфейсных классов не один и не два?

У меня в одном маленьком проекте было семь интерфейсных классов, в каждом из которых порядка 15 - 20 чисто виртуальных методов.

Basil A. SidorovP.S.
Оголтелая оптимизанщина - тревожный звоночек.Вполне возможно... У GCC, кстати, я ничего похожего не заметил (может плохо смотрел).
...
Рейтинг: 0 / 0
25.05.2018, 14:56
    #39649955
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devПредположим, у тебя пол сотни виртуальных методов (я, конечно, прикалываюсь) и размещение vtable на моделях ILP64/LP64/LLP64 добавит к бинарному модулю почти пол килобайта.Физический минимум единицы хранения на диске - те самые "полкило" о которых вы так печётесь.
Простое создание записи о файле в каталоге "отъедает" десятки-сотни байт.

К чему всё это крохоборство???
Может, потратить время с пользой и улучшить дизайн проекта или сократить сроки выпуска?..
...
Рейтинг: 0 / 0
25.05.2018, 15:15
    #39649975
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Basil A. SidorovФизический минимум единицы хранения на диске - те самые "полкило" о которых вы так печётесь.
Простое создание записи о файле в каталоге "отъедает" десятки-сотни байт.Если в сыром формате, то да, но множество файловых систем используют кластера по 4, 8, а то и 16 кБ и если бинарник чуть вылез за пределы кластера хоть на байт, то под него уйдет весь кластер целиком.

Basil A. SidorovК чему всё это крохоборство???Не знаю... Надо мелкомягких спросить. :)
...
Рейтинг: 0 / 0
25.05.2018, 15:27
    #39649989
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Basil A. SidorovК чему всё это крохоборство???

Кому и рак рыба, а у кого-то и жемчуг мелкий )))
/вольный пересказ народной мудрости, я ее дословно не помню/

MSDNUsing this form of __declspec can result in a significant reduction in code size.
...
Рейтинг: 0 / 0
25.05.2018, 17:17
    #39650047
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
rdb_devMasterZivВо-первых, это не стандарт, а расширение какое-то, во-вторых, как же абстрактному классу-то и без vtable ?

P.S. почитал про это -- вообще хрень какая-то... Но и потом -- оно НЕ удаляет vtable, она удаляет лишь использование этого vtable (инициализацию указателя) из конструктора и деструктора.Так нафига абстрактному классу иметь таблицу виртуальных методов, если он никогда не инстанцируется, а используется исключительно для описания интерфейса и наследования? Компилятору достаточно знать только порядок объявлениях виртуальных методов этого класса, а vtable ему без надобности.

А pure virtual function call кто будет говорить?
...
Рейтинг: 0 / 0
25.05.2018, 17:21
    #39650050
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
MasterZivА pure virtual function call кто будет говорить?Pure virtual functions in pure abstract class? :)
...
Рейтинг: 0 / 0
25.05.2018, 17:24
    #39650055
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Я так понимаю, что у M$ объявление классов это часто _внешние_ интерфейсы. Ни наследоваться, ни создавать instance из них никто не планирует. Например объявления классов под интерфейсы COM объектов.

AFAIK
...
Рейтинг: 0 / 0
25.05.2018, 17:26
    #39650056
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отличие Class от Struct
Leonid Kudryavtsev, ООП и виртуальные методы объектов не имеют никакого отношения к COM и OLE. COM и OLE вполне реально пишутся чисто процедурным языком без всяких заморочек. Это просто спецификация интерфейса взаимодействия, внешне напоминающая ООП.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отличие Class от Struct / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]