(C++) class, struct, union в чём разница?
P.S. для чего нужен class можете не объяснять:)
P.S. для чего нужен class можете не объяснять:)
Товарищ, ну это вообще наглость. Это в любой книге по С++ написано!!!
Ключевое слово struct было оставлено Страуструпом в языке исключительно по соображениям совместимости с С.
union в С++ вообще лучше не использовать. По нескольким причинам.
Во-первых, экономия памяти (как главная причина использования union), сегодня (в подавляющем большинстве случаев разработки ПО) просто неактуальна. Во-вторых, использование union сопряжено с риском возникновения трудноуловимых ошибок. Впрочем, это, конечно, зависит от профессионализма программиста.
А можно с этого момента по-подробней??
вообще (насколько мне известно), размер элемента - будет максимальный размер члена етого элемента.
например
union a
{
int i;
char* c;
float f;
double d;
}
сдесь самое большое - ето d - 8 байт. следовательно каждый элемент типа a ? будет занимать 8 байт.
данные всех его составляющих записываются в одно и то же место, раньше, этим можно было пользоваться (да и сейчас можно), для получения представления какого либо числа.
напрмиер разложить float на биты.
теперь юзается reinterpret_cast<>()
Да хотя бы то, что можем прочитать int из юниона, просто забыв о том, что там - float. Лови потом эту ошибку.
А тот же reinterpret_cast - более безопасен, т. к. мы сами явным образом пишем reinterpret_cast <int> (переменная_float). Тут ошибиться труднее, и ошибку найти легче.
Есть и другие средства, в том же boost'е, например.
Вообще, в C++ на юнионы накладываются большие ограничения самим стандартом.
Плохая практика. Можно обойтись др. способами, например, агрегировать произвольный тип, обернув его соотв. оберткой с общим интерфейсом.
те же variant'ы и "безопасные юнионы" есть в boost'е:
boost.any http://boost.org/libs/any/index.html
boost.variant http://boost.org/libs/variant/index.html
те же variant'ы и "безопасные юнионы" есть в boost'е:
boost.any http://boost.org/libs/any/index.html
boost.variant http://boost.org/libs/variant/index.html
Ну я то в курсе. Они там именно так и реализованы, как я сказал.
А я думал, в классе по умолчанию члены защищенные (protected)