Приведение типов

Содержание

Слайд 2

Классификация типов

Типы С++

Пользовательские

Встроенные (Фундаментальные)

Адресные

Арифтметические

void

Указатели

Ссылки

Массивы

С плавающей точкой

Интегральные

double

int

char

enum

struct
class

bool

float

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

Слайд 3

Виды приведений

Явное
Преобразование произвольных типов с указанием оператора приведения
C++-style
static_cast
reinterpret_cast
const_cast
dynamic_cast
С-style
Неявное
Преобразование встроенных типов без

Виды приведений Явное Преобразование произвольных типов с указанием оператора приведения C++-style static_cast
явного указания оператора приведения

Слайд 4

Явное С++-style приведение

Статическое приведение static_cast
Преобразование «родственных» типов:
указатель на потомка в указатель на

Явное С++-style приведение Статическое приведение static_cast Преобразование «родственных» типов: указатель на потомка
родителя (восходящее преобразование)
указатель на void в любой другой указатель
дробного в интегральный
интегральный в перечисление
Слепое приведение reinterpret_cast
Преобразование с сохранением битового представления, невыполнимое явно или при помощи static_cast
Снятие квалификаторов const_cast
Снятие квалификаторов const и volatile
Полиморфное приведение dynamic_cast
Нисходящее преобразование при наследовании

Слайд 5

Примеры явного С++ приведения

int d = static_cast < int >( 7.5 );
int

Примеры явного С++ приведения int d = static_cast ( 7.5 ); int
const * cpd = &d ;
int * pd = const_cast < int * >( cpd );
float f = static_cast < float > ( d );
float * pf = reinterpret_cast( pd );
float * pf2 = static_cast( static_cast(pd) );
float h = *reinterpret_cast( &d );

Слайд 6

Явное С-style приведение

Cast-форма (T)e
Любое преобразование, которое может быть выражено через комбинацию static_cast,

Явное С-style приведение Cast-форма (T)e Любое преобразование, которое может быть выражено через
reinterpret_cast и const_cast.
Функциональная форма T(e)
Для встроенных типов идентична (T)e
Для пользовательских типов вызывает соответствующий конструктор
Для встроенных типов форма T() означает инициализацию нулем

int n = (int)7.6 ;
void const * const pv = 0 ;
float * pr = (float *)pv;
int n_ptr = (int)pv ;

int n = int(7.6) ;
int q = int();
typedef float* float_ptr ;
float * pr = float_ptr(7);

Слайд 7

Неявное преобразование

Применение
Инициализация переменных
Преобразование аргументов функций
Вычисление значения выражения
Приводятся типы:
Арифметические (без потери точности)
Перечислимые к

Неявное преобразование Применение Инициализация переменных Преобразование аргументов функций Вычисление значения выражения Приводятся
интегральным
Указатели к указателям на void
Произвольные типы к идентичным с квалификатором const

Слайд 8

Указатель на void

Переменные типа void* нельзя разыменовывать
Указатель на любой объект можно присвоить

Указатель на void Переменные типа void* нельзя разыменовывать Указатель на любой объект
переменной типа void*
Переменную типа void* можно присвоить другой переменной типа void*
Две переменных типа void* можно сравнивать на равенство и неравенство
void* можно явно преобразовать в другой тип

int n = 0 ;
int * pn = &n ;
*pn = 7 ; // Можно
void * pv = pn ;
*pv = 9 ; // Нельзя!
float * pf = pv ;
float * pq = pn ;
float * pr = (float *)pv;

Слайд 9

Перегрузка функций

Перегрузка по аргументам
Функции с одинаковым именем, но разными типами аргументов, являются

Перегрузка функций Перегрузка по аргументам Функции с одинаковым именем, но разными типами
перегруженными. Выбор перегруженной функции осуществляется при вызове по типу аргументов.
Перегрузка по возвращаемому значению
Функции не перегружаются по возвращаемому значению. Наличие двух функций с одинаковыми именами и аргументами и различающихся только возвращаемым значением, является ошибкой.
Перегрузка и область видимости
Перегруженными являются одноименные функции, расположенные в одной области видимости. Для функций из разных областей видимости действует правило сокрытия имен.

Слайд 10

Правила разрешения вызова

Точное соответствие типа
Тип фактического аргумента соответствует типу формального полностью или

Правила разрешения вызова Точное соответствие типа Тип фактического аргумента соответствует типу формального
с тривиальным преобразованием (массив к указателю, T к const T)
Соответствие с помощью продвижения в группе
Фактический и формальный аргумент принадлежат одной группе арифметических типов, и формальный «больше» фактического. Например, float->double, char->int, short->int и т.п.
Соответствие с помощью неявного преобразования
Существует неявное преобразование, приводящее фактический аргумент к формальному
Соответствие с помощью пользовательского преобразования
Существует объявленное пользователем преобразование, приводящее фактический аргумент к формальному
Соответствие неуказанным аргументам
Формальный аргумент объявлен как ...

Слайд 11

Разрешение вызова

Разрешение вызова при одном аргументе
Осуществляется поиск функции с соответствующим аргументом в

Разрешение вызова Разрешение вызова при одном аргументе Осуществляется поиск функции с соответствующим
порядке указания правил.
Если для правила не нашлось соответствия, переходим к следующему
Если для правила найдено одно соответствие, оно и используется
Если для правила есть более одного соответствия, это считается неоднозначностью вызова (ambiguous call)
Разрешение вызова при многих аргументах
Осуществляется поиск по каждому аргументу
Выбирается функция с наиболее хорошим совпадением одного аргумента, а остальные аргументы имеют не худшее совпадение.
Имя файла: Приведение-типов.pptx
Количество просмотров: 128
Количество скачиваний: 0