Лекция №1. Неизвестные типы и пространство неизвестных имен. Динамическое определение типов. Операторы переключения типов. Создание пространства новых имен. Буферизированный вход и выход
Download 36.96 Kb.
|
Лекция №1 (1)
- Bu sahifa navigatsiya:
- 2. Замена оператора typeid оператором dynamic_cast. Пример.
- Результат выполнения программы
- 3. Оператор const_cast. Пример.
- Результат выполнения программы: t = 20 t+t = 40 x = 100 4. Оператор reinterpret_cast. Пример
Результат выполнения программы
A::Show() B::Show() dynamic_cast Cast A* <= B* -> Error Cast B* <= B* -> Ok Cast A* <= A* -> Ok Cast A* <= B* -> Ok --------------------------------- dynamic_cast 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 Пример. С помощью оператора const_cast через ссылку на константную величину можно снять модификатор const с этой константной величины. #include using namespace std; // 1. Применение const_cast для ссылки void ExampleConstCast1(const int& value) { // снять спецификатор const, получить доступ к value int& ref = const_cast ref = 20; // через ссылку на константную величину можно получить доступ к value // value = 50; - нельзя, expression must be a modifiable lvalue } // 2. Применение const_cast для ссылки void ExampleConstCast2(const int& value) { // снять модификатор const из value const_cast } / 3. Применение const_cast для указателя void ExampleConstCast3(const int* x) { int* p = const_cast *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 где type – результирующий тип; expr – выражение, которое приводится к новому типу. Пример. #include using namespace std; void main() { // 1. Конвертировать char* => int int number; const char* pStr = "Hello world!"; // получить указатель на str как целое число number = reinterpret_cast cout << "number = " << number << endl; // 2. Конвертировать int => double*, // преобразовать целое число в указатель unsigned int num = 300; double* p; p = reinterpret_cast cout << "p = " << p << endl; } Download 36.96 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling