Лекция 30. Преобразования типов в C++ Красс Александр Alexander.Krass@gmail.com СПбГУ ИТМО, 2009.

Презентация:



Advertisements
Похожие презентации
Лекция 7 Приведение типов. Классификация типов Типы С++ Пользовательские Встроенные (Фундаментальные) Адресные Арифтметические void Указатели Ссылки Массивы.
Advertisements

Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Лекция 9 Приведение типов. Классификация типов Типы С++ Пользовательские Встроенные (Фундаментальные) Адресные Арифтметические void Указатели Ссылки Массивы.
©ρŧą Базовые конструкции языка.
©Павловская Т.А. Язык С++ Курс «С++. Программирование на языке высокого уровня» Павловская Т.А.
Лекция 10. Введение в ООП. Часть 3 Красс Александр СПбГУ ИТМО, 2008.
Лекция 31. Динамическая информация о типе Красс Александр СПбГУ ИТМО, 2009.
Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
1 ©Павловская Т.А. Язык С# Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Лекция 15. Введение в ООП. Часть 6 Красс Александр СПбГУ ИТМО, 2008.
Лекция 2. Фундаментальные типы данных и основные конструкции Красс Александр СПбГУ ИТМО, 2008.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Лекция 13. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
УКАЗАТЕЛИ. Переменная - это именованная область памяти с заданным типом. [=значение]; int a; //Переменная типа integer с именем a int b=2;// Переменная.
Элементы языка СИ Средства для написания простейших программ.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Лекция 2 С => C++ => C# Большие и маленькие буквы различаются (main, Main, MAIN, mAin – разные имена) После каждого оператора ставится точка с запятой.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Транксрипт:

Лекция 30. Преобразования типов в C++ Красс Александр СПбГУ ИТМО, 2009

2 Приведение типов Неявные преобразования типов Явные преобразования типов Пользовательские операторы преобразования типа

3 Неявные преобразования типов Неявные преобразования производятся компилятором автоматически Для целых чисел: –Величины типа char, unsigned char, short или unsigned short преобразуются к типу int, если точность типа int достаточна, в противном случае они преобразуются к типу unsigned int. –Величины типа wchar_t и константы перечисленных типов преобразуются к первому из типов int, unsigned int, long и unsigned long, точность которого достаточна для представления данной величины. –Битовые поля преобразуются к типу int, если точность типа int достаточна, или к unsigned int, если точность unsigned int достаточна. В противном случае преобразование не производится. –Логические значения преобразуются к типу int, false становится 0 и true становится 1.

4 Правила стандартных преобразований при выполнении арифметических операций: –вначале, если в выражении один из операндов имеет тип long double, то другой преобразуется также к long double; в противном случае, если один из операндов имеет тип double, то другой преобразуется также к double; в противном случае, если один из операндов имеет тип float, то другой преобразуется также к float; –затем, если в выражении один из операндов имеет тип unsigned long, то другой также преобразуется к unsigned long; в противном случае, если один из операндов имеет тип long, а другой – unsigned int, и тип long может представить все значения unsigned int, то unsigned int преобразуется к long, иначе оба операнда преобразуются к unsigned long; в противном случае, если один из операндов имеет тип long, то другой преобразуется также к long; в противном случае, если один из операндов имеет тип unsigned, то другой преобразуется также к unsigned; в противном случае оба операнда будут типа int. –При выполнении этих правил не происходит потеря точности или значащих цифр результата.

5 Преобразования указателей и ссылок –Если имеется указатель или ссылка на производный тип, а требуется, соответственно, указатель или ссылка на базовый тип. –Если имеется указатель или ссылка на изменяемый объект, а требуется указатель или ссылка на неизменяемый объект того же типа. –Если требуются какие-то другие преобразования, их необходимо указывать явно, но в этом случае вся ответственность за правильность преобразования лежит на программисте.

6 Явные преобразования типов Если неявных преобразований типа не хватает, можно использовать явные. (злоупотреблять ими не стоит) В С++ существует 4 оператора преобразования типов, плюс поддерживается преобразование в стиле C. (c-style casting не рекомендуется) –static_cast –reinterpret_cast –const_cast –dynamic_cast Операторы имеют следующий синтаксис: –some_cast (SourceVar);

7 static_cast static_cast преобразовывает типы, основываясь лишь на сведениях о типах выражений, известных во время компиляции. Операция static_cast выполняет следующие преобразования: –Указатель к указателю –Один числовой тип к другому –Один enum к другому –Один класс в другой если между ними есть отношение наследования. Приведение вверх по иерархии выполняется автоматически, static_cast позволяет выполнять обратное преобразование. (что в общем случае небезопасно.)

8 reinterpret_cast Попытка преобразовать целое число к указателю с помощью оператора static_cast приведет к ошибке компиляции. В этом случае можно использовать reinterpret_cast. –Используя этот оператор вы как бы говорите компилятору: Я лучше тебя знаю, что я делаю. И вообще, твое дело компилировать, а не замечания мне делать –reinterpret-cast небезопасен по определению.

9 const_cast static_cast не поддерживает преобразование из const type в type. Для снятия модификатора const (или volatile) используется const_cast.

10 dynamic_cast dynamic_cast преобразовывает типы, основываясь на проверках времени выполнения. Более безопасен чем static_cast, но и менее быстр. Для его использования нужно включить поддержку RTTI. dynamic_cast поддерживает только преобразование указателей и ссылок на полиморфные типы. (содержащие виртуальные функции) Если преобразование указателя в указатель не возможно, возвращается 0. Если преобразование ссылки в ссылку не возможно, возвращается std::bad_cast. Подробно не описываю, т.к. используется редко. Можно сказать, что использование dynamic_cast свидетельствует о плохом дизайне.

11 C-style casting Имеет следующий синтаксис: –(NewType)OldVar –NewType(OldVar) Компилятор выполняет преобразование, используя комбинацию из static_cast, const_cast, reinterpret_cast. –Мы не знаем, что конкретно сделал компилятор. C-style casting тяжело найти в коде, новые преобразования ищутся легко. Новые преобразования лучше описывают намерения программиста.

12 Пользовательские операторы преобразования типа При неявном преобразовании типов компилятор один раз использует встроенные правила и один раз пользовательские Преобразование из внешнего типа в наш делается через конструктор, принимающий один аргумент: Преобразование из нашего во внешний делается через оператор приведения типа: class String { … String(char *s); operator char*(); };

13 Спасибо за внимание Вопросы?