Глава 6. Базовые типы данных и операции _______151
Программисты на С постоянно пользуются им при работе с maiioc. Функция malloc возвращает указатель на пустой тип (void *). Однако обычно нужен указатель какого-то конкретного типа. Если, например, мы работаем со строками, то нам хотелось бы иметь указатель типа char*; тогда соответствующий код должен выглядеть как-то так:
char *str = (char*)malloc(17) ;
strcpy( str, "Здравствуй, мир!");
В первой строке выделяется 17 байт памяти, достаточных для строки из 16 символов и заключительного нулевого байта (\0). Приведение типа происходит после знака равенства: (char*) - тип void* приводится к char*.
Замечание
Необходимость В приведении типов при каждом вызове malloc явилось одной из причин, по которой операция new потеснила функцию malloc. Вторая причина в том, что если размер типа больше одного байта, нужно умножать количество аргументов на размер типа данных.*Это все чревато ошибками. С операцией new ничего этого делать не нужно.
Существует еще одна форма приведения типов. По виду она более похожа на вызов функции или конструктора (constructor). В этой форме приведения вместо имени типа в скобки заключается переменная. Например, если у вас есть целое, которое нужно преобразовать в символ (и оно не превосходит максимально допустимого значения для символа), то вместо ранее рассмотренного варианта приведения типа:
int a = '65;
char wasint = (char)a;
эту операцию можно записать так:
int A = 65;
char wasint = char(A);
cout « wasint; // вместо 65 напечатается 'А'
Обратите внимание, как операнд char (А) поразительно напоминает вызов функции, хотя эта запись означает просто приведение к символьному типу.
Иногда возникают ситуации, вынуждающие вас прибегать к приведению типов — когда имеется один тип, а требуется другой. Создавая новые программы старайтесь не злоупотреблять приведением типов, но будьте готовы
к тому, что в уже написанных оно будет попадаться вам на каждом шагу.
I
Типы в качестве функций
Как вы уже заметили, часто случается, что требуется не тот тип, который имеется. C++ — язык строго типизированный, а это подразумевает, что компилятор заставит вас обеспечить именно тот тип данных, который нуж-