Лекция №1. Неизвестные типы и пространство неизвестных имен. Динамическое определение типов. Операторы переключения типов. Создание пространства новых имен. Буферизированный вход и выход


Download 36.96 Kb.
bet5/8
Sana25.02.2023
Hajmi36.96 Kb.
#1229591
TuriЛекция
1   2   3   4   5   6   7   8
Bog'liq
Лекция №1 (1)

Результат выполнения программы
A::Show()
B::Show()
dynamic_cast(&obj):
Cast A* <= B* -> Error
Cast B* <= B* -> Ok
Cast A* <= A* -> Ok
Cast A* <= B* -> Ok
---------------------------------
dynamic_cast(ptr -> Type):
Cast B* <= (pA -> B) --> Ok
Cast B* <= (pA -> A) --> Error
Cast A* <= (pB -> B) --> Ok
2. Замена оператора typeid оператором dynamic_cast. Пример.
Если классы образуют иерархию (классы полиморфны), то оператор typeid может быть заменен оператором dynamic_cast.
В примере ниже показана эта возможность.
#include
#include
using namespace std;
// замена оператора typeid оператором dynamic_cast
class A
{
public:
virtual void Show()
{
cout << "A::Show()" << endl;
}
};
class B :public A
{
public:
void Show()
{
cout << "B::Show()" << endl;
}
};
void main(void)
{
// 1. Объявление указателей и объектов классов
A* pA; // указатель на базовый класс
B* pB; // указатель на производный класс
A a;
B b;
// 2. Применение оператора typeid
cout << "typeid:" << endl;
// 2.1. pA->A
pA = &a;
if (typeid(*pA) == typeid(B)) // можно ли *pA привести к типу B
{
pB = (B*)pA;
cout << "Cast B <= (pA->A) --> OK" << endl;
}
else
cout << "Cast B <= (pA->A) --> Error" << endl;
// 2.2. pA->B
pA = &b;
if (typeid(*pA) == typeid(B)) // можно ли *pA привести к типу B
{
pB = (B*)pA;
cout << "Cast B <= (pA->B) --> OK" << endl;
}
else
cout << "Cast B <= (pA->B) --> Error" << endl;
// 3. Применение оператора dynamic_cast
cout << "-----------------------------------" << endl;
cout << "dynamic_cast: " << endl;
// 3.1. pA->A
pA = &a;
pB = dynamic_cast (pA);
if (pB)
cout << "Cast B* <= (pA->A) --> OK" << endl;
else
cout << "Cast B* <= (pA->A) --> Error" << endl;
// 3.2. pA->B
pA = &b;
pB = dynamic_cast (pA);
if (pB)
cout << "Cast B* <= (pA->B) --> OK" << endl;
else
cout << "Cast B* <= (pA->Error) --> Error" << endl;
}
Результат выполнения программы
typeid:
Cast B <= (pA->A) --> Error
Cast B <= (pA->B) --> OK
-----------------------------------
dynamic_cast:
Cast B* <= (pA->A) --> Error
Cast B* <= (pA->B) --> OK
3. Оператор const_cast. Пример.
Оператор const_cast используется для замены модификатора const и/или модификатора volatile.
В этом операторе тип результата должен совпадать с исходным. Оператор const_cast применяется для того чтобы избавиться от модификатора const.
Общий вид оператора const_cast следующий:
const_cast (expr)
Пример.
С помощью оператора const_cast через ссылку на константную величину можно снять модификатор const с этой константной величины.
#include
using namespace std;
// 1. Применение const_cast для ссылки
void ExampleConstCast1(const int& value)
{
// снять спецификатор const, получить доступ к value
int& ref = const_cast (value);
ref = 20; // через ссылку на константную величину можно получить доступ к value
// value = 50; - нельзя, expression must be a modifiable lvalue
}
// 2. Применение const_cast для ссылки
void ExampleConstCast2(const int& value)
{
// снять модификатор const из value
const_cast (value) = value + value;
}
/ 3. Применение const_cast для указателя
void ExampleConstCast3(const int* x)
{
int* p = const_cast (x); // снять const из x
*p = 100;
}
void main()
{
// Демонстрация использования модификатора const_cast
int t = 30;
ExampleConstCast1(t);
cout << "t = " << t << endl; // t = 20
ExampleConstCast2(t);
cout << "t+t = " << t << endl; // t = 20+20 = 40
int x = 50;
ExampleConstCast3(&x);
cout << "x = " << x << endl; // x = 100
}
Результат выполнения программы:
t = 20
t+t = 40
x = 100
4. Оператор reinterpret_cast. Пример
Оператор reinterpret_cast предназначен для преобразования одного типа в другой, даже не совместимый тип. Этот оператор может также применяться к указателям любых типов.
Общая форма:
reinterpret_cast (expr)
где

  • type – результирующий тип;

  • expr – выражение, которое приводится к новому типу.

Пример.
#include
using namespace std;
void main()
{
// 1. Конвертировать char* => int
int number;
const char* pStr = "Hello world!";
// получить указатель на str как целое число
number = reinterpret_cast (pStr);
cout << "number = " << number << endl;
// 2. Конвертировать int => double*,
// преобразовать целое число в указатель
unsigned int num = 300;
double* p;
p = reinterpret_cast (num);
cout << "p = " << p << endl;
}

Download 36.96 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling