Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.

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



Advertisements
Похожие презентации
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Advertisements

Обработка исключений Основы метапрограммированияОбработка исключений Основы метапрограммирования.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Лекция 7 Приведение типов. Классификация типов Типы С++ Пользовательские Встроенные (Фундаментальные) Адресные Арифтметические void Указатели Ссылки Массивы.
Шаблоны 1. Механизм шаблонов реализует в С++ параметрический полиморфизм. 2. Шаблон представляет собой предварительное описание функции или класса, конкретное.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
Лекция 22. Шаблоны (часть 2) Красс Александр СПбГУ ИТМО, 2008.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Лекция 9 Приведение типов. Классификация типов Типы С++ Пользовательские Встроенные (Фундаментальные) Адресные Арифтметические void Указатели Ссылки Массивы.
Лекция 21. Шаблоны (часть 1) Красс Александр СПбГУ ИТМО, 2008.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Лекция 30. Преобразования типов в C++ Красс Александр СПбГУ ИТМО, 2009.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Д.з Язык С++ - занятие 31. Задача 1: 1/1 + 1/3 + 1/5 … #include using namespace std; int main() { int n; cin >> n; double sum = 0;// Сумма for.
Конструирование программ Алгоритмы ( продолжение ) + реализация на С /C++: Работа с дробями Реализация класса строка Шаблоны и шаблонные функции.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
Лекция 10. Введение в ООП. Часть 3 Красс Александр СПбГУ ИТМО, 2008.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Транксрипт:

Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться как переменная другого типа. Преобразование типов потенциально может привести к возникновению ошибок. Его использование не рекомендуется.

Приведение типов в стиле C Операция может записываться в двух формах: тип(выражение) или (тип) выражение. Например float c = double(1)/7; float d = (double)1/7; Приведение типов чаще всего используется для преобразования нетипизированного указателя (на void) в типизированный. Например функция сравнения строк для сортировки выглядит так: int cmp (const void *a, const void *b) { return strcmp( (const char *) a, (const char *) b); }

Операция const_cast Используется для удаления модификатора const. Обычно используется для передачи константного указателя в функцию в качестве параметра, соответствующего обычному указателю. const_cast выражение. void print (int *p) { cout

Операция static_cast Используется вместо приведения типов C, а также для преобразования между указателями и ссылками на объекты одной иерархии. static_cast выражение; float d =static_cast (1)/7;

Пример преобразования типов в иерархии классов class dog : public animal { public: … void guard() { say(); coutguard(); static_cast (f)->guard(); //static_cast (c)->guard(); return 0; } Возможно также обратное преобразование из указателя (или ссылки) на производный класс в базовый. Недостаток статического преобразования - отсутствует контроль за правильностью применения преобразования

Операция dynamic_cast Выполняет преобразование между классами одной иерархии. Результат преобразования может быть проверен. Если объект не может быть преобразован к указанному типу, то возвращается нулевая ссылка. int main() { animal * f = new dog ("filya"); animal * c = new cat ("murka"); dog * d = dynamic_cast (f); if (d) d->guard(); else cout

Динамическое определение типа В С++ определена операция typeid, которая возвращает ссылку на объект класса type_info. У класса type_info есть метод name() – имя типа. Для объектов класса type_info определено сравнение на равенство и неравенство. cout

Шаблоны функций Многие алгоритмы не зависят от типов данных, с которыми работают. Например, вычисление максимального элемента или сортировка. В этом случае можно написать несколько перегруженных функций, но в таком случае один и тот же код придется много раз писать. int max (int a, int b) { if (a>b) return a; else return b; } В С++ можно описать шаблон – семейство функций, которые зависят от типа данных. Конкретный тип данных передается в виде параметра на этапе компиляции. Компилятор автоматически создает код, соответствующий переданному типу.

Описание шаблона функции template заголовок { // тело функции } Может быть несколько параметров, как типов, так и переменных.

Пример использования шаблона template T max (T a, T b) { if (a>b) return a; else return b; } int main() { int a=10, b = 5; double c = 3, d = 10; cout

Обработка шаблона Первый вызов функции приводит к созданию компилятором кода для версии функции соответствующего типа. Этот процесс называется инстанцирование шаблона. Тип инстанцирования либо определяется автоматически исходя из типов параметров, либо задается явно.

Шаблоны классов В С++ можно использовать шаблоны классов template class имя_класса { // поля и методы используют аргумент тип };

Пример: стек данных произвольных типов #include template class stack { private: Data st[Max]; int top; public: stack (): top(0) {} void push(Data x) { st[top++] = x; } Data pop() { return st[--top]; } bool empty() { return (top == 0);} }; int main() { stack s1; s1.push('a'); s1.push('b'); s1.push('c'); cout

Использование шаблонов классов Классы инстанцируются при описании объектов. Шаблоны методов не могут быть виртуальными. Если для определенного типа существует более эффективный код, то можно использовать специализацию шаблона.