Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

20.2.2. Оператор перевизначення модифікаторів const_cast

Оператор const_cast використовують для безпосереднього перевизначення модифікаторів const і/або volatile. Новий тип повинен збігатися з початковим, за винятком його атрибутів const або volatile. Найчастіше оператор const_cast використовують для видалення ознаки постійності (атрибуту const). Його загальний формат має такий вигляд:

const_cast<type> (expr)

У цьому записі елемент type задає новий тип операції приведення, а елемент expr| означає вираз, який приводиться до нового типу.

Оператор const_cast перевизначає модифікатори const і/або volatile.

Використання оператора const_cast продемонстровано в такій програмі.

Код програми 20.9. Демонстрація механізму використання оператора const_cast

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

void fun(const int *p)

{

int *v;

// Перевизначення const-атрибуту.

v = const_cast<int *> (p);

*v = 100; // Тепер об'єкт можна модифікувати

}

int main()

{

int x = 99;

cout << "Значення x до виклику функції fun(): " << x << endl;

fun(&x);

cout << "Значення x після виклику функції fun(): " << x << endl;

getch(); return 0;

}

Результати виконання цієї програми є такими:

Значення х до виклику функції fun(): 99

Значення х після виклику функції fun(): 100

Як бачите, змінна х була модифікована функцією fun(), хоча параметр, який вона приймає, задається як const-покажчик.

Необхідно наголосити на тому, що використання оператора const_cast для видалення const-атрибуту є потенційно небезпечним засобом. Тому поводьтеся з ним дуже обережно.

Варто знати! Видаляти const-атрибут здатний тільки оператор const_cast. Іншими словами, ні dynamic_cast, ні static_cast, ні reinterpret_cast не можна використовувати для зміни const-атрибуту об'єкта.

20.2.3. Оператор неполіморфного приведення типів static_cast

Оператор static_cast виконує операцію неполіморфного приведення типів.

Його можна використовувати для будь-якого стандартного перетворення. При цьому під час роботи програми ніяких перевірок на допустимість не виконується. Оператор static_cast має такий загальний формат запису:

static_cast<type> (expr)

У цьому записі елемент type задає новий тип операції приведення, а елемент expr означає вираз, який приводиться до цього нового типу.

Оператор static_cast, по суті, є замінником оригінального оператора приведення типів. Він тільки виконує неполіморфне перетворення. Наприклад, у процесі виконання наведеної нижче програми змінна типу float приводиться до типу int.

Код програми 20.10. Демонстрація механізму використання оператора static_cast

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int izm;

float fzm;

fzm = 199.22F;

izm = static_cast<int> (fzm);

cout << izm;

getch(); return 0;

}

20.2.4. Оператор перетворення типу reinterpret_cast

Оператор reinterpret_cast перетворить один тип у принципово інший. Наприклад, його можна використовувати для перетворення покажчика в ціле значення і ціле значення у покажчик. Його також можна використовувати для приведення спадково несумісних типів покажчиків. Цей оператор має такий загальний формат запису:

reinterpret_cast<type> (expr)

У цьому записі елемент type задає новий тип операції приведення, а елемент expr означає вираз, який приводиться до цього нового типу.

Оператор reinterpret_cast виконує фундаментальну зміну типу.

Використання оператора reinterpret_cast продемонстровано в такій програмі.

Код програми 20.11. Демонстрація механізму використання оператора reinterpret_cast

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int izm;

char *p = "Це короткий рядок.";

izm = reinterpret_cast<int> (p); // Приводимо покажчик до типу int.

cout << izm;

getch(); return 0;

}

У цій програмі оператор reinterpret_cast перетворить покажчик р у цілочисельне значення. Внаслідок цього перетворення відбувається фундаментальна зміну типу.