Программирование >>  Расширенная версия языка c++ 

1 ... 120 121 122 [ 123 ] 124 125 126 ... 227


Глава 12. Динамическая идентификаций и приведение типов

375

Фабрика производных от класса Num объектов

Num<double> *generator()

switch (rand О % 2) {

case 0: return ne le> (rand() % 100);

case 1: return new Sqr root<double> (rand() % 100);

return NULL;

int {

Nuin<double> оЫ (10), *pl; Squary<double> ob2 (100.0), *p2; Sqr root<double> оЬЗ(999,2), *p3;

int i;

cout Генеруем несколько оСъектов\п ;

for(i=0; i<10; i++) {

pi = generator ( ) ;

p2 = dynaniic cast<Squary<double> if(p2) cou Кваат объекта:

> (pl)

рЗ = dynamic cast<Sqr root<double> *> (pl) if(p3) cou << Квадратный корень объекта:

cou << Значение равно:

cout

г

pl->get val {);

return О;

праАненоя

1. Своими словами объясните назначение оператора dynaillic cast.

2. Дан следующий фрагмент программы. Покажите, как с помощью оператора dynamiccast сделать так, чтобы указатель р указывал на некоторый объект ob только в том случае, если объект ob является объектом типа D2.

class В { >пц

virtual void f{) {} i t.sjr. <. }; .

г . ..

clas Dl: public В {

void f(> {} .

);



12.3. Операторы const cast, reinterpretjcast v\ static cast

Хотя оператор mic cast самый полезный из новых операторов приведения тип1 кроме него программистам доступны еще три. Ниже представлены их основные формы:

салаЬ р9аЬ<целввой ч!т1> {виражвияв)

ireiiiterpcet {виражвнхв) .. J .

3tatic cast<iiMeBoii !r i7> (выражение)

Здесь й тип - это тип, которым должен стать тип параметра выражение после выполнения операции приведения типов. Как правило, указанные

операторы обеспечивают более безопасный и интуитивно понятный способ

выполнения некоторых видов операций преобразования, чем оператор приведения rHiioii, более характерный дж языка С.

Оператор cast при выполнении операции приведения типов используется для явной подмены атрибутов const (постоянный) и/или volatile (переменный). Целевой тип должен совпадать с исходным типом, за исключением изменения его атрибутов const или volatile. Обычно с помощью оператора const cast значение лищают атрибута const.

Оператор static cast предназначен для выполнения операций приведения

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

clas2: public В { , - .

void f О {] *v- .

- }.;.

* - -,

В *p;

3. Переделайте функцию raaiQ() из раздела 12.1, упражнение 4 так, чтобы для запрещения вывода на экран объектов типа NulJSkape использовался не оператор typeid, а оператор dynaroic cast.

4. Будет ли работоспособен следующий фрагмент программы в иерархии классов с базовым классом Num из примера 3 этого раздела?

Mum<int> *Вр;

Squars<double> *Dp; У Л ,

...

Dp = dynamic cast<Nuffi<int (Вр)



Глава 12. Динамическая идентификация ие типов 377

стандартной операции но только не в динамическом режи-

ме (т. е. не во время выполнения программы).

Оператор r€t cast дает возможность преобразовать указатель одного типа в указатель совершенно другого типа. Он также позволяет приводить указатель к типу целого и целое к типу указателя. Оператор reiiiterpret cast следует использовать для выполнения операции приведения внутренне несовместимых типов указателей.

Атрибута const объект можно лишить только с помощью оператора const cast. С помощью оператора dynaiiiic cast, static cast или reuiterpret cast

этого сделать нельзя.

Примерш

1. В следующей программе демонстрируется использование оператора reuiterpret cast.

Пример использования оператора reinterpret cast

ttinclude <iost2:eain> . . , . - :

using namespace std; , , , ,.

int mainO

int i;

char *p = Это строка ;

приведение типа указателя к типу целого .j,., -

i = reinterpret cast<int> (р) ; i ! ..-ч.: ч.Г м,/

cout << i;

return 0; JJi.--tr }\П-.

В данной программе с помощью оператора указатель на стро-

ку превращен в целое. Это фундаментальное преобразование типа и оно хо-рощо отражает возможности оператора reinterpret cast.

2. В следующей программе демонстрируется оператор

Пример использования оператора constcast ♦include <iostrearo>

using namespace std;

voi onst int *p)

/ - .,

int *v; -. - ..- . .



1 ... 120 121 122 [ 123 ] 124 125 126 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика