- •Директивы препроцессора и комментарии
- •Структура программы
- •Переменные
- •Преобразования базовых типов
- •Базовые конструкции структурного программирования
- •Оператор "выражение"
- •Операторы ветвления Условный оператор if
- •If ( выражение ) оператор_1; [else оператор_2;]
- •Оператор switch
- •Массивы
- •Функции
- •Параметры функции
- •Передача массивов в качестве параметров
- •Передача имен функций в качестве параметров
- •Параметры со значениями по умолчанию
- •Модульное программирование
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Области действия идентификаторов
- •Внешние объявления
- •Поименованные области
- •Пространства имен стандартной библиотеки
- •Объектно ориентированное программирование
- •Наследование
- •Использование шаблонов классов
- •Достоинства и недостатки шаблонов
- •Практические примеры. Файловые потоки. Пользовательские функции
- •Пользовательские функции
- •Краткие итоги
- •Вопросы
- •Упражнения
Преобразования базовых типов
В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, перед вычислениями автоматически выполняются неявные преобразования типов. Обычно короткие типы приводятся к более длинным, что обеспечивает сохранение значимости и точности:
( char, short ) -> int -> unsigned int ->
long -> unsigned long -> float ->
double -> long double
Это не означает, что преобразование типа int в double выполняется последовательно по цепочке, просто менее "объемный" тип преобразуется к более "объемному". Типы char и short перед выполнением операции обязательно преобразуются к int. Типом результата выражения обычно является самый "объемный" из типов операндов.
Однако в выражениях с операцией присваивания встречается и обратный вариант, когда более "объемный" тип присваивается менее "объемному", например, float в int. Подобные преобразования связаны с потерей информации (дробная часть отбрасывается), поэтому называются сужающими приведениями (преобразованиями). Компилятор предупреждает о таких операциях.
В логических операциях и условной операции выполняется неявное преобразование к типу bool. При этом любое значение, не равное нулю (даже отрицательное), трактуется как true, а нуль считается false. При обратных преобразованиях величин типа bool к целому типу значение true преобразуется в целую константу 1, а значение false - в 0.
Программист может задать явное преобразование типа. Операция преобразования типа (часто называемая приведением типа ) в стиле С может записываться в двух эквивалентных формах:
( тип ) выражение
тип ( выражение )
Результатом операции является значение заданного типа, например:
int a = 2;
float b = 6.8;
printf( "%lf %d", double ( a ), ( int ) b );
Величина a преобразуется к типу double, а переменная b - к типу int с отсечением дробной части (сужающее приведение).
Явное преобразование типа в стиле С оставлено в С++ только для совместимости. Использовать его не рекомендуется, поскольку оно слишком универсально, а потому чревато плохо диагностируемыми ошибками.
В стандарте С++ определено четыре специализированных операций преобразования типа, которые не являются взаимозаменяемыми и применяются в разных ситуациях:
static_cast<тип>( выражение )
reinterpret_cast<тип>( выражение )
dynamic_cast<тип>( выражение )
const_cast<тип>( выражение )
В зависимости от вида преобразования необходимо использовать соответствующую ему операцию приведения типа. Приведение типа static_cast<T>(e) используется между родственными типами. Его может проверить компилятор. Операция reinterpret_cast выполняет преобразование типов без проверки при компиляции. Оно часто необходимо тогда, когда точно известно, что объекты разных типов занимают в памяти одинаковое количество байт и фактического преобразования делать как раз не нужно. Операция const_cast аннулирует действие модификатора const и применяется достаточно редко. Операция dynamic_cast выполняет преобразование во время работы программы и применяется для преобразования указателей и ссылок родственных полиморфных классов. Примеры применения этих операций вы увидите в следующих лекциях.
