Урок №59. Явна конвертація типів даних

  Юрій  | 

  Оновл. 13 Тра 2020  | 

 216

З попереднього уроку ми вже знаємо, що компілятор в певних випадках виконує неявну конвертацію типів даних. В цьому уроці ми розглянемо як використовувати явну конвертацію типів даних.

Навіщо використовувати явну конвертацію типів даних?

Коли ви хочете змінити один тип даних на інший, який буде більшим (за розміром/по діапазону), то неявна конвертація є хорошим варіантом.

Але багато початківців часто намагаються зробити щось на кшталт наступного: float x = 11 / 3;. Однак, оскільки 11 і 3 є цілими числами, то ніякого числового розширення не відбудеться. Виконується цілочисельне ділення 11 / 3, результатом якого буде значення 3, яке потім неявно конвертується в 3.0 і присвоюється змінній x!

У випадку, коли ви використовуєте літерали (такі як 11 або 3), заміна одного або обох цілочисельних літералів значенням типу з плаваючою крапкою (11.0 або 3.0) призведе до конвертації обох операндів в значення типу з плаваючою точкою і виконається ділення типу з плаваючою крапкою.

Але що буде, якщо використовувати змінні? Наприклад:

Значенням змінної x буде 3. Як повідомити компілятору, що ми хочемо використовувати ділення типу з плаваючою крапкою замість цілочисельного ділення? Правильно! Використати один з операторів явної конвертації типів даних, щоб вказати компілятору виконати явну конвертацію.

Оператори явної конвертації типів даних

У C++ є 5 типів операторів конвертації (або ще  “операторів явної конвертації типів”):

   конвертація C-style;

   static_cast;

   const_cast;

   dynamic_cast;

   reinterpret_cast.

У цьому уроці ми розглянемо конвертацію C-style і static_cast. dynamic_cast ми будемо розглядати, коли дійдемо до вказівників і успадкування. const_cast і reinterpret_cast слід уникати взагалі, тому що вони корисні тільки в деяких випадках і можуть створити чимало проблем, якщо їх використовувати неправильно.

Правило: Уникайте використання const_cast і reinterpret_cast, якщо у вас немає на це вагомої причини.

Конвертація C-style

У програмуванні на мові Cі явна конвертація типів даних виконується за допомогою оператора (). Усередині круглих дужок ми пишемо тип, в який потрібно конвертувати. Цей спосіб конвертації типів називається конвертацією C-style. Наприклад:

У програмі вище ми використовуємо круглі дужки, щоб повідомити компілятору конвертувати змінну i1 (типу int) в тип float. Оскільки i1 стане типу float, то i2 потім автоматично конвертується в тип float також і виконається ділення типу з плаваючою крапкою!

C++ також дозволяє використовувати цей оператор і наступним чином:

Конвертація C-style не перевіряється компілятором під час компіляції, тому може бути неправильно використана, наприклад, при конвертації типів const або при зміні типів даних без урахування їх діапазонів (що призведе до переповнення).

Отже, конвертацію C-style краще не використовувати.

Правило: Не використовуйте конвертацію C-style.

Оператор static_cast

У C++ є ще один оператор явної конвертації типів даних — static_cast. Раніше, в уроці про символьний тип даних char, ми вже використовували static_cast для конвертації змінної типу char в тип int, виводячи замість символу ціле число:

Оператор static_cast найкраще використовувати для конвертації одного фундаментального типу даних в інший:

Основною перевагою static_cast є перевірка компілятором під час компіляції, що ускладнює можливість виникнення ненавмисних проблем. static_cast також (спеціально) має менший вплив, ніж конвертація C-style, тому ви не зможете випадково змінити тип const або зробити інші речі, які не мають сенсу.

Використання операторів явної конвертації в неявній конвертації

Якщо ви будете виконувати небезпечні неявні конвертації типів даних, то компілятор буде скаржитися. Наприклад:

Конвертація змінної типу int (4 байта) в тип char (1 байт) потенційно небезпечна — компілятор видасть попередження. Щоб повідомити йому, що ви навмисно робите щось, що потенційно небезпечно (але хочете зробити це в будь-якому випадку), використовуйте оператор static_cast:

У наступному випадку компілятор буде скаржитися, що конвертація з double в int може привести до втрати даних:

Щоб повідомити компілятору, що ми свідомо хочемо зробити це:

Висновки

Конвертацію типів даних слід уникати взагалі (наскільки це можливо), оскільки щоразу, коли виконується подібна зміна, то і ймовірність виникнення непередбачених проблем також збільшується. Але дуже часто трапляються ситуації, коли цього не уникнути, тому в таких випадках краще використовувати оператор static_cast замість конвертації C-style.

Тест

У чому різниця між явною і неявною конвертаціями типів даних?

Відповідь

Неявна конвертація відбувається, коли компілятор очікує значення одного типу, але отримує значення іншого типу.

Явна конвертація відбувається, коли програміст використовує оператор явної конвертації для конвертації значення з одного типу даних в інший.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (3 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *