Слайд 2
![Исключения 1 Синтаксис: try { } catch (тип имя) {](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-1.jpg)
Исключения 1
Синтаксис:
try {
}
catch (тип имя) {
}
сatch (тип) {
}
catch(…) {
}
Порождение:
throw [выражение];
Слайд 3
![Исключения 2 Пример: void* malloc(size_t n) { void* p =](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-2.jpg)
Исключения 2
Пример:
void* malloc(size_t n) {
void* p = HeapAlloc(GetProcessHeap(), 0, n);
if(!p) throw
“No memory”;
return p;
}
void func {
char* p1 = (char*)malloc(100);
char* p2 = (char*)malloc(100);
delete p2;
delete p1;
}
try {
func();
} catch(const char* p) {
printf(“Error: %s”, p);
}
Слайд 4
![Преобразования типов Синтаксис: 1) тип (выражение); 2) (тип) выражение; Примеры:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-3.jpg)
Преобразования типов
Синтаксис:
1) тип (выражение);
2) (тип) выражение;
Примеры:
const char* p = “asdf”;
int i; char* a;
1) i = p;
2) i = (int)p;
3) i = int(p);
4) a = p;
5) a = (char*)p;
6) a = char*(p);
Слайд 5
![const_cast Синтаксис: const_cast (выражение); Выражение: константный указатель Тип: тот же](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-4.jpg)
const_cast
Синтаксис:
const_cast <тип> (выражение);
Выражение: константный указатель
Тип: тот же что и тип выражения
но без const
Возвращаемое значение: переменую типа ‘тип’
Пример:
const char* p = “asdf”;
char* a = const_cast(p);
Слайд 6
![dynamic_cast 1 Синтаксис: dynamic_cast (выражение); Выражение: указатель или ссылка на](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-5.jpg)
dynamic_cast 1
Синтаксис:
dynamic_cast <тип> (выражение);
Выражение: указатель или ссылка на класс
Тип: базовый или
производный от типа выражения
Возвращаемое значение: переменную типа ‘тип’; при
ошибке: 1) ноль (если ‘тип’ – указатель)
2) исключение bad_cast (если ‘тип’ – ссылка)
Пример: // Повышающее преобразование (upcast)
class B { };
class C : public B { };
C* c = new C();
B* b = dynamic_cast(c);
Слайд 7
![dynamic_cast 2 Примеры: // понижающее преобразование (downcast) 1) class A](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-6.jpg)
dynamic_cast 2
Примеры: // понижающее преобразование (downcast)
1) class A { };
class B
: public A { };
A* a = new A();
B* b = dynamic_cast(a);
2) class A {
public: virtual void Test() {}
};
class B : public A {
public: virtual void Test() {}
};
A* a = new A();
B* b = dynamic_cast(a);
Слайд 8
![dynamic_cast 3 Пример: // понижающее преобразование (downcast) #include class B](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-7.jpg)
dynamic_cast 3
Пример: // понижающее преобразование (downcast)
#include
class B {
public: virtual void
Test();
};
class C : public B { };
void func(B& b) {
try {
С& с = dynamic_cast(b);
} catch (bad_cast) {
}
}
B* b = new B(); func(*b); // исключение
C* c = new C(); func(*c);
Слайд 9
![dynamic_cast 4 Пример: // перекрёстное преобразование (crosscast) class A {](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-8.jpg)
dynamic_cast 4
Пример: // перекрёстное преобразование (crosscast)
class A {
public: virtual void Test()
{}
};
class B : public A {
};
class C : public A {
};
void func(C* c) {
B* b = dynamic_cast(c);
}
B* b = new B();
func((C*)b);
Слайд 10
![dynamic_cast 5 Пример: // перекрёстное преобразование (crosscast) class B {](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-9.jpg)
dynamic_cast 5
Пример: // перекрёстное преобразование (crosscast)
class B {
public: virtual void Test1()
{}
};
class C {
public: virtual void Test2() {}
};
class D : public B, public C {
};
void func(B* b) {
C* c = dynamic_cast(b);
}
D* d = new D();
func(dynamic_cast(d));
Слайд 11
![static_cast 1 Синтаксис: static_cast (выражение); Выражение: целые, вещественные, перечисляемые типы;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-10.jpg)
static_cast 1
Синтаксис:
static_cast <тип> (выражение);
Выражение: целые, вещественные, перечисляемые типы; указатели и ссылки
в одной иерархии
Возвращаемое значение: переменую типа ‘тип’
Пример:
float f = 10.0;
int i = static_cast(f);
Слайд 12
![static_cast 2 Примеры: class B { }; class C: public](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-11.jpg)
static_cast 2
Примеры:
class B { };
class C: public B { };
1) C
c;
B* pb = static_cast(&c);
2) B b;
C& rc = static_cast(b);
Слайд 13
![reinterpret_cast Синтаксис: reinterpret_cast (выражение); Выражение: любое Тип: любой Возвращаемое значение:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-12.jpg)
reinterpret_cast
Синтаксис:
reinterpret_cast <тип> (выражение);
Выражение: любое
Тип: любой
Возвращаемое значение: переменная типа ‘тип’
Примеры:
char* p =
reinterpret_cast(malloc(100));
long l = reinterpret_cast(p);
Слайд 14
![typeid Синтаксис: 1) typeid(тип); 2) typeid(выражение); Примеры: #include class B](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/361092/slide-13.jpg)
typeid
Синтаксис:
1) typeid(тип);
2) typeid(выражение);
Примеры:
#include
class B {
public: virtual void Test(){ }
};
class C:
public B { };
C* c = new C();
B* b = c;
if(typeid(c) == typeid(C*)) {
C* cc = dynamic_cast(b);
}
printf("%s|%s|%s", typeid(int).name(), typeid(c).name(), typeid(*c).name());