
Пользовательские типы данных
1.Ликвидация последствий неправильного обучения
Итак, господа, после долгих размышлений я пришел к выводу, что чего-то я вам недорассказал. Начнем с преобразований типов.
Преобразования типов
Во время практики я понял, что не рассказывать вам это было совершенно глупой идеей. Итак, если разделить int на int, то что получится? Правильно, int. Таким образом данные теряются. На нормальный язык последнее предложение можно перевести следующим примером:
1 2 3 |
int a = 7; int b = 2; cout << a / b; |
Выведет следующее:
Stdout |
3 |
«Но это же неправда!», - скажете вы. Конечно, семь пополам – никак не три. Но если разделить значение типа int на значение типа int, то получится ничто иное как значение типа int. Именно поэтому компьютер округлил результат до ближайшего целого вниз – ведь дробь храниться в int не может.
Поэтому нужно разделить не int на int, а double на double. Сделать из
1 |
(double)7 |
И теперь на этом месте уже не 7, а 7.0. Таким образом, предыдущий пример нужно превратить в такую вещь:
1 2 3 |
int a = 7; int b = 2; cout << (double)a / (double)b; |
С выводом:
Stdout |
3.0 |
Ссылки
Много распространятся на эту тему я не буду. Просто аналогично операции разыменовывания указателя (если вы помните, *), есть оператор взятия адреса (&). Его можно ставить перед переменной, или в списке аргументов функций после типа. Особой разницы в последнем случае между int* и int& нет, просто в первом случае подразумевается, что указатель пустой, а во втором – что по этому адресу что-то хранится. Впрочем, повторяю, условие это необязательно.
2. Перечисления (enumerations).
Итак, дорогие мои, добрались мы таки до темы урока. Пользовательский тип данных – это тип данных, определяемый пользователем. Их можно объявить тремя основными способами (на самом деле четырьмя, но четвертый мы рассматривать не будем ввиду его сложности, кому интересно, могу объяснить персонально). Первый способ – перечисление (enumeration). Значения, которые может принимать тип, задаются набором констант. Каждому значению соответствует своя константа типа unsigned int. Пользователь может сам объявить константы, а может предоставить это компьютеру. На вопрос, не проще было бы объявлять константы как индексы в массиве – с нуля, мы ответим позже, причем довольно сильно. Традиционно либо компьютеру не дают никаких указаний по размещению констант и он их размещает самостоятельно, как раз как индексы в массиве, либо пользователь задает первую константу самостоятельно, а ко всем остальным компьютер просто прибавляет по 1, либо все константы задаются пользователем. Объявляется перечисление следующим образом:
1 2 3 4 5 |
enum letter{ a = 0, b = 1, z = 25 }; |
Как правило, это делается после инклюдов, но до прототипов функций. Как вы видите данный способ довольно прост. Почему он эффективен, вы узнаете позже, пока мы его редко будем использовать. Просто для понимания, потом в коде можно объявить переменную:
1 |
letter first = a; |
И теперь переменной first типа letter присвоено значение a (0). И если написать:
1 |
cout << first; |
То выведет:
Stdout |
0 |
К сожалению, вот так.