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

  Юрій  | 

  Оновл. 4 Вер 2021  | 

 297

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

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

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

Але багато початківців часто намагаються зробити щось на кшталт наступного: 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 Зірок (6 оцінок, середня: 5,00 з 5)
Loading...

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

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