Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KPIYaP_OTVET_2.rtf
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
95 Кб
Скачать

Void f1 ( const int * a ){

int * p = const_cast< int * > ( a );

*p = *a * *a;

}

Void f2 ( const int& a){

const_cast<int & > ( a ) = a * a;

}

Int main () {

int i = 2;

cout << i << " " ;

f1 (&i);

cout << i << " ";

f2( i );

cout << i << " ";

return 0 ;

}

// =================

Output:

2 4 16

// =================

2.27

Оператор reinterpret_cast.

reinterpret_cast < type > ( expr )

Особенности:

  • используется для работы с битовыми областями данных - преобразования несовместимых типов указателей, а также для преобразования целых типов в указатели и наоборот

  • нельзя использовать для преобразования типов с const и volatile

  • не рекомендуется к использованию ( не безопасен )

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

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

#include <iostream>

using namespace std;

Int main(){

char *s = "string";

int i = reinterpret_cast < int > ( s );

cout << i;

return 0;

}

// ==============

Output:

4260188

//===============

2.28

Оператор static_cast.

static_cast < type > ( expr )

Особенности:

  • используется для неполиморфного приведения типов - можно применять для любого стандартного приведения типов как и обычный оператор приведения

  • может быть применен для преобразования указателя на базовый класс к указателю на производный класс, но это не всегда безопасно и никаких проверок во вермя преобразования не производится

  • нельзя использовать для преобразования типов с модификаторами const и volatile

#include < iostream >

using namespace std;

Int main (){

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

cout << static_cast< double > ( i ) / 3 << " ";

return 0;

}

// ========

Output:

0 0.333333 0.666667 1 1.3333333 1.666667 2 2.33333 2.666667 3

// ========

#include < iostream >

using namespace std;

class B{

public :

int b;

void init() { b = 0; cout << " B::init() ";}

virtual void show () { cout << "B::show() ";}

};

class D: public B{

public:

int d;

void init(){ b = d = 0; cout << " D::init() ";}

void show(){ cout << " D:;show() ";}

};

Int main(){

B * pb, b;

D * pd, d;

pb = &d;

pd = static_cast< D* > ( pb );

pd->show();

pd->init();

pb = &b;

pd = static_cast < D* > ( pb );

pd->show();

pd->init();

return 0 ;

}

// ====================

Run-Time Check Failure - Stack aroun the variable 'b' was corrupted.

D::show() D::init() B::show() D::init()

2.29

Оператор dynamic_cast.

Особенности:

  • используется для динамического приведения полиморфных типов ( указателей или ссылок ) с проверкой корректности приведения во время выполнения программы

  • если приведение оказывается некорректным, то оно не выполняется - формируется признак ошибки

  • нельзя использовать для преобразования типов с const и volatile

  • expr - выражение, которое приводится к новому типу, должно вычислять указатель или ссылку

  • type - результирующий тип ( указатель или ссылка )

Правила приведения полиморфных типов:

  • оператор dynamic_cast выполняется успешно, если указатель или ссылка, подвергающаяся приведению, в момент приведения ссылается на объект результирующего еласс или производного от результирующего

  • при невозможности динамического приведения возвращается нулевой указатель ( применитльно к указателям ) или генерируется исключительная ситуация bad_cast ( применительно к ссылкам )

Если даны класс Вase и производный от него класс Derived:

  • приведение указателя Derived* к типу Вase* возможно ВСЕГДА - по стандартным правилам наследования указатель на базовый класс может ссылаться на объект производного класса

  • приведение указателя Base* к типу Derived* возможно лишь в случае, когда указатель Base* в момент приведения действмительно ссылается на объект класса Derived

#include < iostream >

#include < typeinfo >

using namespace std;

class B{

public :

int b;

void init() { b = 0; cout << " B::init() ";}

virtual void show () { cout << "B::show() ";}

};

class D: public B{

public:

int d;

void init(){ b = d = 0; cout << " D::init() ";}

void show(){ cout << " D:;show() ";}

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]