русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Явные преобразования static_cast, dynamic_cast.


Дата добавления: 2015-07-09; просмотров: 917; Нарушение авторских прав


Операция static_cast

Операция static_cast используется для преобразования типа на этапе компиля­ции между:

□ целыми типами;

□ целыми и вещественными типами;

□ целыми и перечисляемыми типами;

□ указателями и ссылками на объекты одной иерархии, при условии, что оно однозначно и не связано с понижающим преобразованием виртуального базо­вого класса.

Формат операции:

Static_cast <тип> (выражение)

Результат операции имеет указанный тип, который может быть ссылкой, указа­телем, арифметическим или перечисляемым типом,

При выполнении операции внутреннее представление данных может быть моди­фицировано, хотя численное значение остается неизменным. Например:

float f - 100:

int ,i = static_cast <int> (f);

// Целые и вещественные имеют различное внутреннее представление

Такого рода преобразования применяются обычно для подавления сообщений компилятора о возможной потере данных в том случае, когда есть уверенность, что требуется выполнить именно это действие. Результат преобразования остает­ся на совести программиста.

Операция static_cast позволяет выполнять преобразования из производного класса в базовый и наоборот без ограничений:

class В{};

class С: public В{}: С с:

В *bp = static_cast<B*>(c): // Производный -> базовый В b:

С &ср = static_cast<C&>(b); // Базовый -> производный

Преобразование выполняется при компиляции, при этом объекты могут не быть полиморфными. Программист должен сам отслеживать допустимость дальней­ших действий с преобразованными величинами.

В общем случае использование для преобразования указателей родственных классов иерархии предпочтительнее использовать операцию dynamic_cast. В этом случае если преобразование возможно на этапе компиляции, генерируется тот же код, что и для static_cast. Кроме того, dynamic_cast допускает перекрестное пре­образование, нисходящее приведение виртуального базового класса и произво­дит проверку допустимости приведения во время выполнения.



Операция dynamic_cast

Операция применяется для преобразования указателей родственных классов ие­рархии, в основном — указателя базового класса в указатель на производныйкласс, при этом во время выполнения программы производится проверка допус­тимости преобразования.

Формат операции:

dynamiccast <тип *> (выражение)

Выражение должно быть указателем или ссылкой на класс, тип — базовым или про­изводным для этого класса. После проверки допустимости преобразования в слу­чае успешного выполнения операция формирует результат заданного типа, в противном случае для указателя результат равен нулю, а для ссылки порожда­ется исключение bad_cast. Если заданный тип и тип выражения не относятся к одной иерархии, преобразование не допускается.

Повышающее преобразование

Выполнение с помощью операции dynamic_cast повышающего преобразования равносильно простому присваиванию:

class В{ /* ... */ }:

class C: public В{ /* ... */ }:

C* с = new C:

В* b = dynamic_cast<B*>(c); // Эквивалентно В* b = с:

Понижающее преобразование

Чаще всего операция dynamic_cast применяется при понижающем преобразова­нии — когда компилятор не имеет возможности проверить правильность приве­дения.

Производные классы могут содержать функции, которых нет в базовых классах. Для их вызова через указатель базового класса нужно иметь уверенность, что этот указатель в действительности ссылается на объект производного класса. Та­кая проверка производится в момент выполнения приведения типа с использова­нием RTTI (run-time type information) — «информации о типе во время выполне­ния программы». Для того чтобы проверка допустимости могла быть выполнена, аргумент операции dynamic_cast должен быть полиморфного типа, то есть иметь хотя бы один виртуальный метод (см. с. 205).

Для использования RTTI необходимо подключить к программе заголовочный файл <typeinfo>. Кроме того, необходимо, чтобы был установлен соответствующий режим ком­пилятора.

С помощью операции dynamic_cast такое преобразование возможно при условии, что класс является полиморфным и преобразование недвусмысленно. Рассмотрим пример, в котором выполняется понижающее преобразование вирту­ального базового класса:

#include <iostream.h>

#include <typeinfo.h>

class A{

public: virtual ~A(){};};

class B: public virtual A{}:

class С: public virtual A{};

class D: public B. public C{};

void demo(A *a){

D* d - dynamic_cast<D*>(a);

if (d) { ... }

}

int main(){

D *d - new D; demo(d); return 0:

}

Преобразование ссылок

Для аргумента-ссылки смысл операции преобразования несколько иной, чем для указателя. Поскольку ссылка всегда указывает на конкретный объект, операция dynaramic_cast должна выполнять преобразование именно к типу этого объекта. Корректность приведения проверяется автоматически, в случае несовпадения порождается исключение badcast:

Перекрестное преобразование

Операция dynamic_cast позволяет выполнять безопасное преобразование типа между производными классами одного базового класса.

 



<== предыдущая лекция | следующая лекция ==>
Множественное наследование. | Обработка исключительных ситуаций.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.103 сек.