Википедия

Приведение типа

Приведе́ние (преобразование) ти́па (англ. type conversion, typecasting) — в информатике преобразование значения одного типа в значение другого типа.

Описание

Выделяют приведения типов:

Явное приведение задаётся программистом в тексте программы с помощью:

  • конструкции языка;
  • встроенных функций, принимающей значение одного типа и возвращающей значение другого типа.

Неявное приведение выполняется транслятором (компилятором или интерпретатором) по правилам, описанным в стандарте языка. Стандарты большинства языков запрещают неявные преобразования.

В объектно-ориентированных языках, таких как C++, механизм наследования реализуется посредством приведения типа указателя или ссылки на текущий объект к базовому классу (в типобезопасных, таких как OCaml, понятие о приведении типов отсутствует принципиально, и допустимость обращения к компоненту подтипа контролируется механизмом проверки согласования типов на этапе компиляции, а в машинном коде остаётся прямое обращение).

Неявное приведение типа

Неявное приведение типа в языках C/C++

Неявное приведение типов происходит в следующих случаях:

  • после вычисления операндов бинарных арифметических, логических, битовых операций, операций сравнения, а также 2-го или 3-го операнда операции «?:»; значения операндов приводятся к одинаковому типу;
  • перед выполнением присваивания;
  • перед передачей аргумента функции;
  • перед возвратом функцией возвращаемого значения;
  • после вычисления выражения конструкции switch значение приводится к целочисленному типу;
  • после вычисления выражений конструкций if, for, while, do-while значение приводится к типу bool.

Например, при выполнении бинарной арифметической операции значения операндов приводятся к одному типу. При наследовании указатели производного класса приводятся к указателям базового класса.

Рассмотрим пример на языке C.

double d; // вещественный тип long l; // целый тип int i; // целый тип if ( d > i ) d = i; if ( i > l ) l = i; if ( d == l ) d *= 2; 

При выполнении операций сравнения и при присваивании переменные разных типов неявно приводятся к одному типу.

При неявных преобразованиях возможны побочные эффекты. Например, при приведении числа вещественного типа к целому типу дробная часть отсекается (округление не выполняется). При обратном преобразовании возможно понижение точности из-за различий в представлении вещественных и целочисленных чисел. Например, в переменной типа float (число с плавающей точкой одинарной точности по стандарту IEEE 754), нельзя сохранить число 16 777 217 без потери точности, а в 32-битной переменной целого типа int — можно. Из-за потери точности операции сравнения одного и того же числа, представленного целым и вещественным типами (например, int и float), могут давать ложные результаты (числа могут быть не равны).

#include <stdio.h> int main ( void ) {  int i_value = 16777217;  float f_value = 16777216.0;  printf( "The integer is:%d\n", i_value );  printf( "The float is: %f\n", f_value );  printf( "Their equality:%d\n", i_value == f_value ); } 

Приведённый код выведет следующее, если размер int — 32 бита и компилятор поддерживает стандарт IEEE 754:

 The integer is: 16777217 The float is: 16777216.000000 Their equality: 1 

Явное приведение типа

Приведения типов в языке C

Для явного приведения типов имя типа указывается в круглых скобках перед переменной или выражением. Рассмотрим пример.

int X; int Y = 200; char C = 30; X = (int)C * 10 + Y; // переменная С приводится к типу int 

Для вычисления последнего выражения компилятор выполняет примерно следующие действия:

  • сначала переменная C символьного типа char явно приводится к целочисленному типу int путём расширения разрядности;
  • выполняется вычисление операндов для операции умножения. Левый операнд имеет тип int. Правый операнд — константа 10, а такие константы по умолчанию имеют тип int. Так как оба операнда оператора «*» имеют тип int, неявное приведение типов не выполняется. Результат умножения тоже имеет тип int;
  • выполняется вычисление операндов операции сложения. Левый операнд — результат умножения имеет тип int. Правый операнд — переменная Y имеет тип int. Так как оба операнда оператора «+» имеют тип int, неявное приведение к общему типу не выполняется. Результат сложения тоже имеет тип int;
  • выполнение присваивания. Левый операнд — переменная X имеет тип int. Правый операнд — результат вычисления выражения, записанного справа от знака «=», тоже имеет тип int. Так как оба операнда оператора «=» имеют одинаковый тип, неявное приведение типов не выполняется.

Но даже при этом возможны ошибки. Тип char может быть как знаковым (signed char), так и беззнаковым (unsigned char); результат зависит от реализации компилятора и такое поведение разрешено стандартом. Значение беззнакового типа char при преобразовании к знаковому типу int может оказаться отрицательным из-за особенностей реализации машинных инструкций на некоторых процессорах. Чтобы избежать неоднозначностей, рекомендуется явно указывать знаковость для типа char.

Приведения типов в языке C++

В языке C++ существует пять операций для явного приведения типа. Первая операция — круглые скобки ((type_to)expression_from) поддерживается для сохранения совместимости с C. Остальные четыре операции записываются в виде

xxx_cast< type_to >( expression_from ) 

Рассмотрим пример.

y = static_cast< signed short >( 65534 ); // переменной y будет присвоено значение -2 

Громоздкие ключевые слова являются напоминанием программисту о том, что приведение типа чревато проблемами.

Операция static_cast

Назначение: допустимые приведения типов.

Операция static_cast аналогична операции «круглые скобки» с одним исключением: она не выполняет приведение указателей на неродственные типы (для этого применяется операция reinterpret_cast).

Применение:

  • преобразование между числовыми и enum, в том числе если неявное преобразование невозможно (int enum class) или приводит к предупреждению «Возможная потеря точности» (double float);
  • приведение указателей к типу void* и наоборот;
  • приведение указателей на производные типы к указателям на базовые типы и наоборот;
  • выбор одной из нескольких перегруженных функций;
bool myLess(const wchar_t*, const wchar_t*); bool myLess(const std::wstring&, const std::wstring&); std::vector<std::wstring> list; std::sort(list.begin(), list.end(), static_cast<bool(*)(const std::wstring&, const std::wstring&)>(myLess)); 
  • явный вызов конструктора с одним аргументом или перегруженной операции приведения типа;
struct Type {  // конструктор с одним аргументом для приведения типа int к типу Type  Type ( int );  // перегруженная операция для приведения типа Type к типу double  operator double () const; }; int main () {  Type x, y;  int i;  double d;  // вызов конструктора с одним аргументом  x = y + static_cast< Type >( i );  // вызов перегруженной операции приведения типа  d = static_cast< double >( x );  return 0; } 
конструктор может иметь большее число аргументов, но для них должны быть заданы значения по умолчанию;
struct Type {  // конструктор с несколькими аргументами для приведения типа int к типу Type;  // для 2-го и последующих аргументов заданы значения по умолчанию  Type ( int, int = 10, float = 0.0 ); }; 
  • приведение типа в шаблонах (компилятор уже при специализации шаблона решает, какие операции использовать);
  • приведение операндов тернарной условной операции «?:» к одному типу (значения 2-го и 3-го операндов должны иметь одинаковый тип);

Ограничения на expression_from: нет.

Ограничения на type_to: должен существовать способ преобразования значения выражения expression_from к типу type_to, с помощью operator type_to или конструктора.

Производит ли операция static_cast код: в общем случае да (например, вызов перегруженной операции приведения типа или конструктора).

Источники логических ошибок: зависят от того, что собираетесь делать операцией. Возможны переполнения, выход за диапазон и даже (для преобразования указателей) порча памяти.

Пути избавления: зависят от задачи, и часто избавляться не нужно.

Примеры.

// Получить процент попаданий. double hitpercent (  const int aHitCount, // число попаданий  const int aShotCount // число выстрелов ) {  if ( aShotCount == 0 ) return 0.0;  // Приведение типов к double выполняется для выполнения вещественного (не целочисленного) деления  return static_cast< double >( aHitCount * 100 ) / static_cast< double >( aShotCount ); } // следующие строчки эквивалентны // использование операции static_cast string s = static_cast< string >( "Hello!" ); // вызов конструктора с одним аргументом string s = string( "Hello!" ); // использование операции «круглые скобки» string s = (string) "Hello!"; string s = static_cast< string >( 5 ); // не компилируется, компилятор не может найти подходящий конструктор 

Операция dynamic_cast

Назначение: приведение вниз по иерархии наследования, с особым поведением, если объект не имеет нужного типа. Используется именно в случаях, когда программист не уверен в типе.

Операция получает информацию о типе объекта expression_from с помощью RTTI. Если тип будет type_to или его подтипом, приведение выполняется. Иначе:

  • для указателей возвращается NULL;
  • для ссылок создаётся исключение std::bad_cast.

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

Ограничения на type_to: любой другой виртуальный.

Производит ли операция dynamic_cast код: да.

Логические ошибки возможны, если операции передать аргумент, не имеющий тип type_to, и не проверить указатель на равенство NULL (соответственно не обработать исключение std::bad_cast).

Пути избавления: продуманная объектная система. Иногда (например, в обработке событий пользовательского интерфейса) dynamic_cast используют только как дополнительную самопроверку, когда и без того известно, какого типа объект, спровоцировавший событие.

Операция const_cast

Назначение: снятие/установка модификатора(ов) const, volatile и/или mutable. Часто это применяется, чтобы обойти неудачную архитектуру программы или библиотеки, для стыковки с другими языками, для передачи информации через обобщённые указатели void*, для одновременного написания const- и не-const-версии функции

Ограничения на expression_from: выражение должно возвращать ссылку или указатель.

Ограничения на type_to: тип type_to должен совпадать с типом выражения expression_from с точностью до модификатора(ов) const, volatile и mutable .

Производит ли операция const_cast код: нет.

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

Пути избавления: просчитанная const-корректность и удачный API: с Си++17 string.data() получила версию без const. С Си++14 — общая шаблонная функция, возвращающая decltype(auto), и функции с const и без вызывают её. С Си++23 эту функцию сразу можно использовать как метод.

Для примера рассмотрим код динамической библиотеки.

#include <string> // string using namespace std; namespace {  string s = "Wikipedia"; // Глобальная переменная  // метод string::c_str() возвращает указатель типа const char * } typedef char * PChar; void __declspec( dllexport ) WINAPI SomeDllFunction ( PChar & rMessage ) {  // преобразование char const * в char *  rMessage = const_cast< char * >( s.c_str() ); } 

При загрузке библиотеки в память процесса создаёт новый сегмент данных, в котором размещаются глобальные переменные. Код функции SomeDllFunction() находится в библиотеке и при вызове возвращает указатель на строковые данные. Операция const_cast используется для удаления модификатора const.

Операция reinterpret_cast

Назначение: каламбур типизации — назначение ячейке памяти другого типа (не обязательно совместимого с данным) с сохранением битового представления.

Объект, возвращаемый выражением expression_from, рассматривается как объект типа type_to.

Ограничения на expression_from: выражение должно возвращать значение порядкового типа (любой из целых, логический bool или перечислимый enum), указатель или ссылку.

Ограничения на type_to:

  • Если expression_from возвращает значение порядкового типа или указатель, тип type_to может быть порядковым типом или указателем.
  • Если expression_from возвращает ссылку, тип type_to должен быть ссылкой.

Производит ли операция reinterpret_cast код: нет.

Источники логических ошибок. Объект, возвращаемый выражением expression_from, может не иметь типа type_to. Нет никакой возможности проверить это, всю ответственность за корректность преобразования программист берёт на себя.

Пути избавления: поскольку функция предназначена для работы на низком уровне и обхода ошибок чужой архитектуры, практически нет. Одну из задач — низкоуровневую работу с битами и байтами памяти — можно и нужно заменять на функцию bit_cast Си++20.

Рассмотрим примеры.

// Возвращает true, если число x конечное. // Возвращает false, если число x равно ∞ или NaN. bool isfinite ( double const x ) {  // преобразование double const -> uint64_t const &  uint64_t const & y = reinterpret_cast< uint64_t const & >( x );  return ( ( y & UINT64_C( 0x7FF0000000000000 ) ) != UINT64_C( 0x7FF0000000000000 ) ); } // попытка получения адреса временного значения long const & y = reinterpret_cast< long const & >( x + 5.0 ); // ошибка: выражение x + 5.0 не является ссылкой 

См. также

  • Dynamic cast
  • Динамическая идентификация типа данных (RTTI)
  • Типизация данных
  • Каламбур типизации

Примечания

  1. cppreference.com. Implicit conversions Архивная копия от 18 декабря 2014 на Wayback Machine.
  2. open-std.org ISO/IEC 9899:2018 C Programming Language Standard (C18) Архивная копия от 22 июля 2020 на Wayback Machine 6.3.1.4 Real floating and integer.
  3. C++ Weekly - Ep 283 - Stop Using const_cast! - YouTube. Дата обращения: 20 августа 2021. Архивировано 20 августа 2021 года.

Ссылки

  • Robert C. Seacord ПINT02-C. Understand integer conversion rules (англ.), cert.org

Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Приведение типа, Что такое Приведение типа? Что означает Приведение типа?

Privede nie preobrazovanie ti pa angl type conversion typecasting v informatike preobrazovanie znacheniya odnogo tipa v znachenie drugogo tipa OpisanieVydelyayut privedeniya tipov yavnye angl explicit neyavnye angl implicit cast coercion Yavnoe privedenie zadayotsya programmistom v tekste programmy s pomoshyu konstrukcii yazyka vstroennyh funkcij prinimayushej znachenie odnogo tipa i vozvrashayushej znachenie drugogo tipa Neyavnoe privedenie vypolnyaetsya translyatorom kompilyatorom ili interpretatorom po pravilam opisannym v standarte yazyka Standarty bolshinstva yazykov zapreshayut neyavnye preobrazovaniya V obektno orientirovannyh yazykah takih kak C mehanizm nasledovaniya realizuetsya posredstvom privedeniya tipa ukazatelya ili ssylki na tekushij obekt k bazovomu klassu v tipobezopasnyh takih kak OCaml ponyatie o privedenii tipov otsutstvuet principialno i dopustimost obrasheniya k komponentu podtipa kontroliruetsya mehanizmom proverki soglasovaniya tipov na etape kompilyacii a v mashinnom kode ostayotsya pryamoe obrashenie Neyavnoe privedenie tipaNeyavnoe privedenie tipa v yazykah C C Neyavnoe privedenie tipov proishodit v sleduyushih sluchayah posle vychisleniya operandov binarnyh arifmeticheskih logicheskih bitovyh operacij operacij sravneniya a takzhe 2 go ili 3 go operanda operacii znacheniya operandov privodyatsya k odinakovomu tipu pered vypolneniem prisvaivaniya pered peredachej argumenta funkcii pered vozvratom funkciej vozvrashaemogo znacheniya posle vychisleniya vyrazheniya konstrukcii span class k switch span znachenie privoditsya k celochislennomu tipu posle vychisleniya vyrazhenij konstrukcij span class k if span span class k for span span class k while span span class k do span span class k while span znachenie privoditsya k tipu span class kt bool span Naprimer pri vypolnenii binarnoj arifmeticheskoj operacii znacheniya operandov privodyatsya k odnomu tipu Pri nasledovanii ukazateli proizvodnogo klassa privodyatsya k ukazatelyam bazovogo klassa Rassmotrim primer na yazyke C double d veshestvennyj tip long l celyj tip int i celyj tip if d gt i d i if i gt l l i if d l d 2 Pri vypolnenii operacij sravneniya i pri prisvaivanii peremennye raznyh tipov neyavno privodyatsya k odnomu tipu Pri neyavnyh preobrazovaniyah vozmozhny pobochnye effekty Naprimer pri privedenii chisla veshestvennogo tipa k celomu tipu drobnaya chast otsekaetsya okruglenie ne vypolnyaetsya Pri obratnom preobrazovanii vozmozhno ponizhenie tochnosti iz za razlichij v predstavlenii veshestvennyh i celochislennyh chisel Naprimer v peremennoj tipa span class kt float span chislo s plavayushej tochkoj odinarnoj tochnosti po standartu IEEE 754 nelzya sohranit chislo 16 777 217 bez poteri tochnosti a v 32 bitnoj peremennoj celogo tipa span class kt int span mozhno Iz za poteri tochnosti operacii sravneniya odnogo i togo zhe chisla predstavlennogo celym i veshestvennym tipami naprimer span class kt int span i span class kt float span mogut davat lozhnye rezultaty chisla mogut byt ne ravny include lt stdio h gt int main void int i value 16777217 float f value 16777216 0 printf The integer is d n i value printf The float is f n f value printf Their equality d n i value f value Privedyonnyj kod vyvedet sleduyushee esli razmer span class kt int span 32 bita i kompilyator podderzhivaet standart IEEE 754 The integer is 16777217 The float is 16777216 000000 Their equality 1Yavnoe privedenie tipaPrivedeniya tipov v yazyke C Dlya yavnogo privedeniya tipov imya tipa ukazyvaetsya v kruglyh skobkah pered peremennoj ili vyrazheniem Rassmotrim primer int X int Y 200 char C 30 X int C 10 Y peremennaya S privoditsya k tipu int Dlya vychisleniya poslednego vyrazheniya kompilyator vypolnyaet primerno sleduyushie dejstviya snachala peremennaya span class n C span simvolnogo tipa span class kt char span yavno privoditsya k celochislennomu tipu span class kt int span putyom rasshireniya razryadnosti vypolnyaetsya vychislenie operandov dlya operacii umnozheniya Levyj operand imeet tip span class kt int span Pravyj operand konstanta 10 a takie konstanty po umolchaniyu imeyut tip span class kt int span Tak kak oba operanda operatora imeyut tip span class kt int span neyavnoe privedenie tipov ne vypolnyaetsya Rezultat umnozheniya tozhe imeet tip span class kt int span vypolnyaetsya vychislenie operandov operacii slozheniya Levyj operand rezultat umnozheniya imeet tip span class kt int span Pravyj operand peremennaya span class n Y span imeet tip span class kt int span Tak kak oba operanda operatora imeyut tip span class kt int span neyavnoe privedenie k obshemu tipu ne vypolnyaetsya Rezultat slozheniya tozhe imeet tip span class kt int span vypolnenie prisvaivaniya Levyj operand peremennaya span class n X span imeet tip span class kt int span Pravyj operand rezultat vychisleniya vyrazheniya zapisannogo sprava ot znaka tozhe imeet tip span class kt int span Tak kak oba operanda operatora imeyut odinakovyj tip neyavnoe privedenie tipov ne vypolnyaetsya No dazhe pri etom vozmozhny oshibki Tip span class kt char span mozhet byt kak znakovym span class kt signed span span class w span span class kt char span tak i bezznakovym span class kt unsigned span span class w span span class kt char span rezultat zavisit ot realizacii kompilyatora i takoe povedenie razresheno standartom Znachenie bezznakovogo tipa span class kt char span pri preobrazovanii k znakovomu tipu span class kt int span mozhet okazatsya otricatelnym iz za osobennostej realizacii mashinnyh instrukcij na nekotoryh processorah Chtoby izbezhat neodnoznachnostej rekomenduetsya yavno ukazyvat znakovost dlya tipa span class kt char span Privedeniya tipov v yazyke C V yazyke C sushestvuet pyat operacij dlya yavnogo privedeniya tipa Pervaya operaciya kruglye skobki span class p span span class n type to span span class p span span class n expression from span podderzhivaetsya dlya sohraneniya sovmestimosti s C Ostalnye chetyre operacii zapisyvayutsya v vide xxx cast lt type to gt expression from Rassmotrim primer y static cast lt signed short gt 65534 peremennoj y budet prisvoeno znachenie 2 Gromozdkie klyuchevye slova yavlyayutsya napominaniem programmistu o tom chto privedenie tipa chrevato problemami Operaciya static cast Osnovnaya statya static cast Naznachenie dopustimye privedeniya tipov Operaciya span class k static cast span analogichna operacii kruglye skobki s odnim isklyucheniem ona ne vypolnyaet privedenie ukazatelej na nerodstvennye tipy dlya etogo primenyaetsya operaciya span class k reinterpret cast span Primenenie preobrazovanie mezhdu chislovymi i enum v tom chisle esli neyavnoe preobrazovanie nevozmozhno span class kt int span span class w span span class err span span class w span span class k enum span span class w span span class k class span ili privodit k preduprezhdeniyu Vozmozhnaya poterya tochnosti span class kt double span span class w span span class err span span class w span span class kt float span privedenie ukazatelej k tipu span class kt void span span class o span i naoborot privedenie ukazatelej na proizvodnye tipy k ukazatelyam na bazovye tipy i naoborot vybor odnoj iz neskolkih peregruzhennyh funkcij bool myLess const wchar t const wchar t bool myLess const std wstring amp const std wstring amp std vector lt std wstring gt list std sort list begin list end static cast lt bool const std wstring amp const std wstring amp gt myLess yavnyj vyzov konstruktora s odnim argumentom ili peregruzhennoj operacii privedeniya tipa struct Type konstruktor s odnim argumentom dlya privedeniya tipa int k tipu Type Type int peregruzhennaya operaciya dlya privedeniya tipa Type k tipu double operator double const int main Type x y int i double d vyzov konstruktora s odnim argumentom x y static cast lt Type gt i vyzov peregruzhennoj operacii privedeniya tipa d static cast lt double gt x return 0 konstruktor mozhet imet bolshee chislo argumentov no dlya nih dolzhny byt zadany znacheniya po umolchaniyu struct Type konstruktor s neskolkimi argumentami dlya privedeniya tipa int k tipu Type dlya 2 go i posleduyushih argumentov zadany znacheniya po umolchaniyu Type int int 10 float 0 0 privedenie tipa v shablonah kompilyator uzhe pri specializacii shablona reshaet kakie operacii ispolzovat privedenie operandov ternarnoj uslovnoj operacii k odnomu tipu znacheniya 2 go i 3 go operandov dolzhny imet odinakovyj tip Ogranicheniya na expression from net Ogranicheniya na type to dolzhen sushestvovat sposob preobrazovaniya znacheniya vyrazheniya expression from k tipu type to s pomoshyu operator type to ili konstruktora Proizvodit li operaciya span class k static cast span kod v obshem sluchae da naprimer vyzov peregruzhennoj operacii privedeniya tipa ili konstruktora Istochniki logicheskih oshibok zavisyat ot togo chto sobiraetes delat operaciej Vozmozhny perepolneniya vyhod za diapazon i dazhe dlya preobrazovaniya ukazatelej porcha pamyati Puti izbavleniya zavisyat ot zadachi i chasto izbavlyatsya ne nuzhno Primery Poluchit procent popadanij double hitpercent const int aHitCount chislo popadanij const int aShotCount chislo vystrelov if aShotCount 0 return 0 0 Privedenie tipov k double vypolnyaetsya dlya vypolneniya veshestvennogo ne celochislennogo deleniya return static cast lt double gt aHitCount 100 static cast lt double gt aShotCount sleduyushie strochki ekvivalentny ispolzovanie operacii static cast string s static cast lt string gt Hello vyzov konstruktora s odnim argumentom string s string Hello ispolzovanie operacii kruglye skobki string s string Hello string s static cast lt string gt 5 ne kompiliruetsya kompilyator ne mozhet najti podhodyashij konstruktor Operaciya dynamic cast Osnovnaya statya Dynamic cast Naznachenie privedenie vniz po ierarhii nasledovaniya s osobym povedeniem esli obekt ne imeet nuzhnogo tipa Ispolzuetsya imenno v sluchayah kogda programmist ne uveren v tipe Operaciya poluchaet informaciyu o tipe obekta expression from s pomoshyu RTTI Esli tip budet type to ili ego podtipom privedenie vypolnyaetsya Inache dlya ukazatelej vozvrashaetsya NULL dlya ssylok sozdayotsya isklyuchenie span class n std span span class o span span class n bad cast span Ogranicheniya na expression from vyrazhenie dolzhno byt ssylkoj ili ukazatelem na obekt imeyushij hotya by odnu virtualnuyu funkciyu Ogranicheniya na type to lyuboj drugoj virtualnyj Proizvodit li operaciya span class k dynamic cast span kod da Logicheskie oshibki vozmozhny esli operacii peredat argument ne imeyushij tip type to i ne proverit ukazatel na ravenstvo span class nb NULL span sootvetstvenno ne obrabotat isklyuchenie span class n std span span class o span span class n bad cast span Puti izbavleniya produmannaya obektnaya sistema Inogda naprimer v obrabotke sobytij polzovatelskogo interfejsa dynamic cast ispolzuyut tolko kak dopolnitelnuyu samoproverku kogda i bez togo izvestno kakogo tipa obekt sprovocirovavshij sobytie Operaciya const cast Naznachenie snyatie ustanovka modifikatora ov span class k const span span class k volatile span i ili span class k mutable span Chasto eto primenyaetsya chtoby obojti neudachnuyu arhitekturu programmy ili biblioteki dlya stykovki s drugimi yazykami dlya peredachi informacii cherez obobshyonnye ukazateli void dlya odnovremennogo napisaniya const i ne const versii funkcii Ogranicheniya na expression from vyrazhenie dolzhno vozvrashat ssylku ili ukazatel Ogranicheniya na type to tip type to dolzhen sovpadat s tipom vyrazheniya expression from s tochnostyu do modifikatora ov span class k const span span class k volatile span i span class k mutable span Proizvodit li operaciya span class k const cast span kod net Istochniki logicheskih oshibok programma mozhet izmenit neizmenyaemyj obekt Inogda eto mozhet privesti k oshibke segmentacii inogda podprogramma mozhet ne ozhidat chto pamyat kotoruyu ona predostavila dlya chteniya vdrug izmenili Puti izbavleniya proschitannaya const korrektnost i udachnyj API s Si 17 span class n string span span class p span span class n data span span class p span poluchila versiyu bez const S Si 14 obshaya shablonnaya funkciya vozvrashayushaya span class k decltype span span class p span span class k auto span span class p span i funkcii s const i bez vyzyvayut eyo S Si 23 etu funkciyu srazu mozhno ispolzovat kak metod Dlya primera rassmotrim kod dinamicheskoj biblioteki include lt string gt string using namespace std namespace string s Wikipedia Globalnaya peremennaya metod string c str vozvrashaet ukazatel tipa const char typedef char PChar void declspec dllexport WINAPI SomeDllFunction PChar amp rMessage preobrazovanie char const v char rMessage const cast lt char gt s c str Pri zagruzke biblioteki v pamyat processa sozdayot novyj segment dannyh v kotorom razmeshayutsya globalnye peremennye Kod funkcii span class n SomeDllFunction span span class p span nahoditsya v biblioteke i pri vyzove vozvrashaet ukazatel na strokovye dannye Operaciya span class k const cast span ispolzuetsya dlya udaleniya modifikatora span class k const span Operaciya reinterpret cast Naznachenie kalambur tipizacii naznachenie yachejke pamyati drugogo tipa ne obyazatelno sovmestimogo s dannym s sohraneniem bitovogo predstavleniya Obekt vozvrashaemyj vyrazheniem expression from rassmatrivaetsya kak obekt tipa type to Ogranicheniya na expression from vyrazhenie dolzhno vozvrashat znachenie poryadkovogo tipa lyuboj iz celyh logicheskij span class kt bool span ili perechislimyj span class k enum span ukazatel ili ssylku Ogranicheniya na type to Esli expression from vozvrashaet znachenie poryadkovogo tipa ili ukazatel tip type to mozhet byt poryadkovym tipom ili ukazatelem Esli expression from vozvrashaet ssylku tip type to dolzhen byt ssylkoj Proizvodit li operaciya span class k reinterpret cast span kod net Istochniki logicheskih oshibok Obekt vozvrashaemyj vyrazheniem expression from mozhet ne imet tipa type to Net nikakoj vozmozhnosti proverit eto vsyu otvetstvennost za korrektnost preobrazovaniya programmist beryot na sebya Puti izbavleniya poskolku funkciya prednaznachena dlya raboty na nizkom urovne i obhoda oshibok chuzhoj arhitektury prakticheski net Odnu iz zadach nizkourovnevuyu rabotu s bitami i bajtami pamyati mozhno i nuzhno zamenyat na funkciyu span class n bit cast span Si 20 Rassmotrim primery Vozvrashaet true esli chislo x konechnoe Vozvrashaet false esli chislo x ravno ili NaN bool isfinite double const x preobrazovanie double const gt uint64 t const amp uint64 t const amp y reinterpret cast lt uint64 t const amp gt x return y amp UINT64 C 0x7FF0000000000000 UINT64 C 0x7FF0000000000000 popytka polucheniya adresa vremennogo znacheniya long const amp y reinterpret cast lt long const amp gt x 5 0 oshibka vyrazhenie x 5 0 ne yavlyaetsya ssylkojSm takzheDynamic cast Dinamicheskaya identifikaciya tipa dannyh RTTI Tipizaciya dannyh Kalambur tipizaciiPrimechaniyacppreference com Implicit conversions Arhivnaya kopiya ot 18 dekabrya 2014 na Wayback Machine open std org ISO IEC 9899 2018 C Programming Language Standard C18 Arhivnaya kopiya ot 22 iyulya 2020 na Wayback Machine 6 3 1 4 Real floating and integer C Weekly Ep 283 Stop Using const cast YouTube neopr Data obrasheniya 20 avgusta 2021 Arhivirovano 20 avgusta 2021 goda SsylkiRobert C Seacord PINT02 C Understand integer conversion rules angl cert orgV state ne hvataet ssylok na istochniki sm rekomendacii po poisku Informaciya dolzhna byt proveryaema inache ona mozhet byt udalena Vy mozhete otredaktirovat statyu dobaviv ssylki na avtoritetnye istochniki v vide snosok 3 yanvarya 2015 V drugom yazykovom razdele est bolee polnaya statya Type conversion angl Vy mozhete pomoch proektu rasshiriv tekushuyu statyu s pomoshyu perevoda

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто