Разработка приложений на C++
  • Введение
  • Особенности разработки программ на С++
    • Указатель на функцию
    • Преобразование типов
    • Наследование
    • Виртуальные функции
    • Перегрузка операций
    • Функциональные объекты
    • Шаблоны
    • Пространства имён
    • Обработка исключительных ситуаций
    • Немного о компиляции и сборке
    • Рекоммендации по написанию кода
    • Новые возможности стандарта С++11
    • Терминология
  • Понятие структур данных
    • Массивы
    • Динамические структуры
  • Метапрограммирование
    • Шаблоны функций
    • Шаблоны классов
    • Специализация шаблонов
      • Пример: вычисление факториала
      • Пример: числа Фиббоначчи
    • Конфигурации шаблонных классов
  • Стандартная библиотека С++
    • Обзор стандартной библиотеки С++
    • Структура стандартной библиотеки С++
      • Концепции
    • Ввод-вывод данных
    • Примитивы, определённые в библиотеке STL
    • Итераторы
    • Контейнеры
      • Inplus: Как это работает
    • Алгоритмы
      • inplus: Как это работает
    • Примеры использования стандартной библиотеки С++
    • Стандартная библиотека С++/Вопросы
    • Стандартная библиотека С++/Примеры лабораторных работ
  • Разработка и использование библиотек программирования
    • Создание библиотек программирования
    • Использование динамических библиотек
    • Вопросы
    • Примеры лабораторных работ
  • Ответы на вопросы
Powered by GitBook
On this page
  1. Особенности разработки программ на С++

Преобразование типов

В связи с тем, что С++ является строго типизированным языком, лучшая практика в преобразовании типов - избегать преобразований. Часто, если появляется необходимость в преобразовании типов (не задуманная программистом), значит, в программе есть какие-то проблемы.

Так как язык С++ является наследником языка С, то в программах С++ можно использовать преобразование типов в стиле С. Однако, данное преобразование типов является небезопасным, так как позволяет использовать заведомо неправильные конструкции, например:

badboy.cpp
struct array{
  double* value;
  size_t size;
}* p = new array;

float* a = (float*)p;

Компилятор языка С++ в данном случае не выдаст ошибку, не смотря на то, что представлено заведомо неправильное преобразование указателей.

Для написания безопасного кода в язык С++ были введены 4 оператора преобразования типов, такие как:

  • static_cast - используется для преобразования статических переменных базового типа или сравнимых указателей (например, указатель на объект родительского класса в указатель на объект дочернего класса). Пример использования:

    int a = 10, b = 3;
    float result = static_cast<float>(a) / b;
  • const_cast - используется при преобразовании неконстантных выражений в константые и наоборот. Не рекомендуется к использованию! Данный оператор позволяет , в частности, изменять выражения, определённые как константные.

  • dynamic_cast - используется для преобразования указателей. Чаще всего можно обойтись без данного преобразования. Пример использования:

    struct A {int value; };
    struct B: A { void Print(){}; };
    A* a = new B();
    dynamic_cast<B*>(a)->Print();
  • reinterpret_cast - по поведению совпадает с преобразованием типов в стиле С. Не рекомендуется к использованию!

PreviousУказатель на функциюNextНаследование

Last updated 1 year ago