Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

(C++) class, struct, union в чём разница?

548
23 декабря 2007 года
Maximillian_Cavalera
157 / / 16.08.2007
В чём разница между ними и для чего каждый используется.
P.S. для чего нужен class можете не объяснять:)
370
23 декабря 2007 года
koval
443 / / 29.08.2005
Цитата: Maximillian_Cavalera
В чём разница между ними и для чего каждый используется.
P.S. для чего нужен class можете не объяснять:)




Товарищ, ну это вообще наглость. Это в любой книге по С++ написано!!!

1.8K
24 декабря 2007 года
CilCatblack
251 / / 20.09.2007
Это не только в книгах о С++ написано, да это в любую книгу посмотри!:D
22K
24 декабря 2007 года
deninok
16 / / 01.03.2007
Различие одно: в class все члены по умолчанию закрыты (private), в struct - открыты (public). Точка.
Ключевое слово struct было оставлено Страуструпом в языке исключительно по соображениям совместимости с С.
union в С++ вообще лучше не использовать. По нескольким причинам.
Во-первых, экономия памяти (как главная причина использования union), сегодня (в подавляющем большинстве случаев разработки ПО) просто неактуальна. Во-вторых, использование union сопряжено с риском возникновения трудноуловимых ошибок. Впрочем, это, конечно, зависит от профессионализма программиста.
255
24 декабря 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: deninok
Во-вторых, использование union сопряжено с риском возникновения трудноуловимых ошибок.


А можно с этого момента по-подробней??

16K
24 декабря 2007 года
HolyDel
11 / / 03.03.2006
еще можно использовать union для создания типов - типа variant.
вообще (насколько мне известно), размер элемента - будет максимальный размер члена етого элемента.
например
union a
{
int i;
char* c;
float f;
double d;
}
сдесь самое большое - ето d - 8 байт. следовательно каждый элемент типа a ? будет занимать 8 байт.
данные всех его составляющих записываются в одно и то же место, раньше, этим можно было пользоваться (да и сейчас можно), для получения представления какого либо числа.
напрмиер разложить float на биты.
теперь юзается reinterpret_cast<>()
350
25 декабря 2007 года
cheburator
589 / / 01.06.2006
Цитата: Dart Bobr
А можно с этого момента по-подробней??


Да хотя бы то, что можем прочитать int из юниона, просто забыв о том, что там - float. Лови потом эту ошибку.
А тот же reinterpret_cast - более безопасен, т. к. мы сами явным образом пишем reinterpret_cast <int> (переменная_float). Тут ошибиться труднее, и ошибку найти легче.
Есть и другие средства, в том же boost'е, например.
Вообще, в C++ на юнионы накладываются большие ограничения самим стандартом.

3
25 декабря 2007 года
Green
4.8K / / 20.01.2000
Цитата: HolyDel
еще можно использовать union для создания типов - типа variant.


Плохая практика. Можно обойтись др. способами, например, агрегировать произвольный тип, обернув его соотв. оберткой с общим интерфейсом.

350
25 декабря 2007 года
cheburator
589 / / 01.06.2006
HolyDel, Green,
те же variant'ы и "безопасные юнионы" есть в boost'е:
boost.any http://boost.org/libs/any/index.html
boost.variant http://boost.org/libs/variant/index.html
3
25 декабря 2007 года
Green
4.8K / / 20.01.2000
Цитата: cheburator
HolyDel, Green,
те же variant'ы и "безопасные юнионы" есть в boost'е:
boost.any http://boost.org/libs/any/index.html
boost.variant http://boost.org/libs/variant/index.html


Ну я то в курсе. Они там именно так и реализованы, как я сказал.

350
27 декабря 2007 года
cheburator
589 / / 01.06.2006
Цитата: deninok
Различие одно: в class все члены по умолчанию закрыты (private), в struct - открыты (public).


А я думал, в классе по умолчанию члены защищенные (protected)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог