Как конвертировать типы данных в C++

Kak Konvertirovat Tipy Dannyh V C



Процесс изменения типа данных одной переменной в другую известен как преобразование типов или приведение типов в C++. Это сделано для выполнения математических операций над переменными разных типов данных, путем обеспечения совместимости их типов данных друг с другом. Преобразование типов оптимизирует код. Например, при вычислении разницы между двумя переменными, если одно число имеет тип данных с плавающей запятой, а другое — целочисленный тип данных, тогда целочисленный тип данных будет преобразован в тип с плавающей запятой для выполнения вычитания.

Как конвертировать типы данных в C++

В C++ существует два способа изменения типов данных:

Неявное преобразование типов

Согласно предопределенным правилам компилятора кода C++, неявное преобразование типов — это преобразование типов, выполняемое компилятором автоматически без необходимости какого-либо внешнего триггера со стороны пользователя. Этот тип преобразования обычно происходит в программе, когда имеется более одного типа данных, и тип данных выражения не соответствует типу данных переменной, участвующей в этом выражении.







Чтобы избежать потери данных во время преобразования, компилятор по умолчанию меняет тип данных низкой точности на тип данных более высокой точности. Например, он преобразует целое число в число с плавающей запятой, а не меняет число с плавающей запятой на целое число, чтобы предотвратить потерю данных. Это называется продвижением. Ниже приведена диаграмма приоритета для различных типов данных.





Заказ на преобразование типа

Правильный порядок преобразования типов задается следующим образом:





бул -- > чар -- > короткий интервал -- > интервал -- > беззнаковое целое -- > длинный -- > беззнаковый длинный -- > долго долго -- > плавать -- > двойной -- > длинный двойной

Переменная типа низкой точности преобразуется в тип данных высокой точности, чтобы предотвратить потерю данных.

Пример 1

В этом примере сложение выполняется для переменных разных типов данных с использованием неявного преобразования типов.



#include
с использованием пространство имен стандартный ;

интервал основной ( ) {
интервал число '=' 100 ;
голец характер '=' 'С' ;
расчет << '100 + 'С' = ' << число + характер << конец ;

плавать вал '=' число + 'с' ;
расчет << 'float val(100 + 'c') = ' << вал << конец ;

интервал был '=' 7890 ;
длинный не было '=' был ;
расчет << 'var_int = ' << не было ;
возвращаться 0 ;
}

Здесь добавляются целое число и символ из таблицы ASCII, а также число с плавающей запятой и символ «c». Целое число сохраняется в третьем сегменте как длинный тип данных, а типы данных изменяются самим компилятором на основе его предопределенных правил.

Сумма 100 и «C» возвращает 167, поскольку «C» соответствует 67 в цифрах, а 100 + «c» возвращает 199, поскольку строчная буква «c» соответствует 99. Переменная int хранится в длинном типе данных.

Пример 2

В этом примере символ D преобразуется в число с плавающей запятой для выполнения операции деления.

#include
с использованием пространство имен стандартный ;

интервал основной ( ) {
голец Икс '=' 'Д' ;

плавать float_var ;

float_var '=' плавать ( Икс ) / 'с' ;
// Явное преобразование целого числа в число с плавающей запятой.

расчет << 'Значение float_var: ' << float_var << конец ;

возвращаться 0 ;
}

Входное значение имеет форму символа D, который хранится в типе данных с плавающей запятой и далее делится на символ C. Эти символы преобразуются в числовые значения, и над ними выполняется операция деления, возвращающая значение с плавающей запятой.

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

Пользователь должен вручную изменить тип данных с помощью явного преобразования типов C++, часто известного как приведение типов. Этот тип приведения делается для того, чтобы избежать неявного преобразования типов. Существует два метода выполнения явного приведения типов в C++:

  • Преобразование с помощью оператора присваивания
  • Преобразование с использованием оператора Cast

Преобразование типов с помощью оператора присваивания в C++

Преобразование типов с помощью оператора присваивания выполняется принудительно, то есть один тип данных преобразуется в другой вручную. Это достигается с помощью оператора присваивания «=», который присваивает значение правого операнда переменной в его левой части.

Пример
Эта программа вычисляет площадь круга, используя приведение типов.

#include
#include
с использованием пространство имен стандартный ;
интервал основной ( )
{
интервал радиус ;
расчет <> радиус ;
плавать область '=' М_ПИ * радиус * радиус ;
расчет << «Площадь круга с радиусом» << радиус << '=' << область ;
}

Оператор присваивания используется для присвоения значения с плавающей запятой области, которая состоит из значения радиуса в целочисленном типе данных.

Площадь круга возвращается в виде данных типа float, а радиус вводится в виде целочисленного типа данных. Таким образом, тип данных переменной изменяется посредством приведения типа с использованием оператора присваивания.

Преобразование типов с помощью оператора Cast в C++

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

Существует четыре разных оператора приведения:

  • static_cast
  • const_cast
  • динамический_cast
  • reinterpret_cast

1: статический_каст

static_cast — это оператор приведения, который используется для явного преобразования чисел с плавающей запятой и символов в целые числа и т. д. Это самый простой оператор приведения. Он может приводить типы данных, схожие по своей природе. Он может преобразовывать указатели из одной формы в другую, поэтому его также можно использовать для управления памятью.

Синтаксис

static_cast ( выражение )

Пример
Эта программа создана для преобразования переменной типа double в тип данных int с использованием static_cast. Он обрежет любую десятичную часть в выводе.

#include
с использованием пространство имен стандартный ;
интервал основной ( )
{
// объявляем переменную
двойной п ;
п '=' 2905 * 1235 * 24 675 ;
плавать результат ;

расчет << 'Перед использованием статического приведения:' << конец ;
расчет << 'Значение p = ' << п << конец ;

// используем static_cast для преобразования типа данных
результат '=' static_cast ( п ) ;
расчет << ' После использования статического приведения: ' << конец ;
расчет << 'Значение результата = ' << результат << конец ;

возвращаться 0 ;
}

Первоначально в двойную переменную p загружаются значения, которые умножаются друг на друга и сохраняются в результате. Результат содержит результат до и после оператора static_cast:

До использования оператора static_cast результат отображается в десятичных точках, а после использования этого оператора — в целочисленном типе данных.

2: const_cast

Оператор const_cast используется для преобразования постоянного значения объекта в непостоянный тип. Он используется там, где объявлен постоянный объект, и нам нужно время от времени менять его значение.

Синтаксис

const_cast ( выражение )

Пример
В этом примере оператор const_cast используется для временного удаления квалификатора константы и позволяет вносить изменения в переменную по мере необходимости:

#include
с использованием пространство имен стандартный ;
интервал основной ( ) {
константа интервал Икс '=' 70 ;
константа интервал * и '=' & Икс ;
расчет << «Старое значение» << * и << ' \п ' ;
интервал * С '=' const_cast ( и ) ;
* С '=' 90 ;
расчет << «Новое значение» << * и ;
возвращаться 0 ;
}

Квалификатор константы присваивается переменной типа int x, что означает, что эту переменную нельзя изменить напрямую. После этого для доступа к x используется указатель int *y, но его по-прежнему нельзя изменить, а его исходное значение отображается с помощью cout. Используя оператор const_cast, создается указатель z, который не является константой. Он используется для доступа к значению x, что делает его доступным для редактирования. Он меняет значение, присвоенное z, на 90, что косвенно изменяет значение x.

Первоначально значение постоянной переменной x равно 70, которое изменяется с помощью оператора const_cast, делая его равным 90.

3: динамический_каст

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

Синтаксис

динамический_cast ( выражение )

Пример
В этом примере оператор Dynamic_cast используется для проверки типа полиморфного класса и обеспечивает доступ как к членам базового, так и к производному классу.

#include
#include <исключение>
с использованием пространство имен стандартный ;
сорт TBase
{
общественный :
плавать base_g '=' 9,81 ;

виртуальный пустота дурачок ( )
{

} ;
} ;

сорт TDerived : общественный TBase
{
общественный :
интервал local_g '=' 9,78 ;
} ;

интервал основной ( )
{

TBase * база '=' новый TDerived ;
TDerived * полученный ;

полученный '=' динамический_cast ( база ) ;

расчет < base_g << конец ;
расчет < local_g << конец ;

получитьчар ( ) ;
возвращаться 0 ;
}

Два класса определены как базовые и производные. База указателей типа TBase* создается и присваивается динамически выделяемому объекту типа TDerived. В этом случае полиморфизма объект производного класса может быть присвоен указателю базового класса. Dynamic_cast проверяет, обращается ли указатель к допустимому объекту TDerived. Если приведение дает успешный результат, производный класс получит действительный результат, в противном случае он вернет нулевое значение.

4: переинтерпретировать_cast

reinterpret_cast преобразует указатель одного типа данных в указатель другого типа данных. Он не проверяет, совпадают ли типы данных указателей или нет. Этот оператор литья необходимо использовать и обращаться с ним осторожно.

Пример
На этой иллюстрации указатель одного типа данных переинтерпретируется в указатель другого типа данных с помощью reinterpret_cast:

#include
с использованием пространство имен стандартный ;

интервал основной ( )
{
интервал * д '=' новый интервал ( 70 ) ;
голец * ч '=' reinterpret_cast ( д ) ;
расчет << * д << конец ;
расчет << * ч << конец ;
расчет << д << конец ;
расчет << ч << конец ;
возвращаться 0 ;
}

Первоначально целому числу присваивается значение 70. Указатель q указывает на это динамически выделяемое целое число. reinterpret_cast используется для переинтерпретации указателя q как указателя символа ch, что означает, что память, первоначально назначенная q, теперь обрабатывается так, как если бы она была символом. Используя команду cout, она печатает значение, присвоенное q и ch. Поскольку ch рассматривается как указатель на символ, он вернет символьное значение.

Он печатает значение, указанное в ch, используя *ch. Однако, поскольку ch рассматривается как указатель на символ, эта строка будет интерпретировать память как символ. Он печатает адрес памяти, хранящийся в указателе ch, используя ch. Это тот же адрес памяти, что и q, поскольку это просто новая интерпретация той же памяти.

Первоначально целое число хранит 70. Позже оно изменяется между указателем q и указателем ch. Выходные данные 2 и 4 одинаковы, поскольку второе значение переинтерпретируется с помощью reinterpret_cast.

Примечание : рекомендуется не использовать этот оператор приведения до тех пор, пока это не станет острой необходимостью, поскольку он делает объект непереносимым продуктом.

Заключение

Процесс изменения типа данных одной переменной в другую известен как преобразование типов или приведение типов в C++. Это сделано для выполнения математических операций над переменными разных типов данных, путем обеспечения совместимости их типов данных друг с другом. Преобразование типов оптимизирует код. В C++ существуют неявные и явные преобразования типов. Неявное преобразование типов выполняется самим компилятором с использованием предопределенного набора правил, тогда как явное преобразование типов выполняется программистом с помощью операторов присваивания и операторов приведения.