Глава 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++ — язык строго типизированный, а это подразумевает, что компилятор заставит вас обеспечить именно тот тип данных, который нуж-