Kaip konvertuoti duomenų tipus C++

Kaip Konvertuoti Duomenu Tipus C



Vieno kintamojo duomenų tipo keitimo į kitą procesas C++ yra žinomas kaip tipo konvertavimas arba tipo liejimas. Tai atliekama norint atlikti matematines operacijas su skirtingų duomenų tipų kintamaisiais, suderinant jų duomenų tipus tarpusavyje. Tipo konvertavimas optimizuoja kodą. Pavyzdžiui, skaičiuojant skirtumą tarp dviejų kintamųjų, jei vienas skaičius yra slankiojo tipo, o kitas sveikojo skaičiaus duomenų tipas, tada sveikasis duomenų tipas bus konvertuojamas į slankiojo tipo atimtį.

Kaip konvertuoti duomenų tipus C++

C++ yra du būdai pakeisti duomenų tipus:

Netiesioginė tipo konversija

Pagal C++ kodo kompiliatoriaus iš anksto nustatytas taisykles, numanomas tipo konvertavimas yra tipo konvertavimas, kurį kompiliatorius atlieka automatiškai, nereikalaujant jokio išorinio vartotojo paleidimo. Šio tipo konvertavimas dažniausiai vyksta programoje, kai yra daugiau nei vienas duomenų tipas, o išraiškos duomenų tipas nesutampa su šioje išraiškoje dalyvaujančio kintamojo duomenų tipu.







Kad būtų išvengta duomenų praradimo konvertuojant, kompiliatorius pagal numatytuosius nustatymus pakeičia žemo tikslumo duomenų tipą į didesnio tikslumo duomenų tipą. Pavyzdžiui, jis konvertuos sveikąjį skaičių į slankųjį skaičių, o ne pakeis slankųjį skaičių į sveikąjį skaičių, kad būtų išvengta duomenų praradimo. Tai vadinama skatinimu. Toliau pateikiama skirtingų duomenų tipų pirmumo diagrama.





Užsakymas tipo konvertavimui

Teisinga tipo konvertavimo tvarka pateikiama taip:





bool -- > char -- > trumpas int -- > int -- > nepasirašytas int -- > ilgai -- > nepasirašytas ilgas -- > ilgas ilgas - > plūdė -- > dvigubas -- > ilgas dvigubas

Mažo tikslumo tipo kintamasis konvertuojamas į didelio tikslumo duomenų tipą, kad būtų išvengta duomenų praradimo.

1 pavyzdys

Šiame pavyzdyje skirtingų duomenų tipų kintamasis pridedamas naudojant numanomą tipo konvertavimą.



#include
naudojant vardų erdvė std ;

tarpt pagrindinis ( ) {
tarpt numerį = 100 ;
char charakteris = 'C' ;
cout << '100 + 'C' = ' << numerį + charakteris << endl ;

plūdė val = numerį + 'c' ;
cout << 'float val(100 + 'c') = ' << val << endl ;

tarpt buvo = 7890 ;
ilgai nebuvo = buvo ;
cout << 'var_int = ' << nebuvo ;
grąžinti 0 ;
}

Čia pridedamas sveikasis skaičius ir simbolis iš ASCII lentelės, taip pat slankusis skaičius ir simbolis „c“. Sveikasis skaičius laikomas trečiajame segmente kaip ilgas duomenų tipas, o duomenų tipus keičia pats kompiliatorius pagal iš anksto nustatytas taisykles.

100 ir „C“ suma grąžina 167, nes „C“ skaičiais prilygsta 67, o 100+“c“ grąžina 199, nes mažosiomis raidėmis „c“ prilygsta 99. Kintamasis int saugomas ilgo tipo duomenų.

2 pavyzdys

Šiame pavyzdyje simbolis D paverčiamas plūduriu, kad būtų atlikta padalijimo operacija.

#include
naudojant vardų erdvė std ;

tarpt pagrindinis ( ) {
char x = 'D' ;

plūdė float_var ;

float_var = plūdė ( x ) / 'c' ;
// Aiškus int pavertimas plūduriuojančiu.

cout << 'Float_var reikšmė yra: ' << float_var << endl ;

grąžinti 0 ;
}

Įvesties reikšmė yra simbolio D pavidalu, kuris yra saugomas slankiojo duomenų tipo ir toliau dalijamas simboliu C. Šie simboliai pakeičiami į skaitines reikšmes ir su jais atliekama padalijimo operacija, grąžinant reikšmę slankiuoju būdu.

Aiškus tipo konvertavimas

Naudotojas turi rankiniu būdu pakeisti duomenų tipą naudodamas C++ aiškų tipo konvertavimą, dažnai vadinamą tipo liejimu. Šio tipo liejimas atliekamas siekiant išvengti numanomo tipo konvertavimo. Yra du būdai, kaip atlikti aiškų tipą C++:

  • Konvertavimas naudojant priskyrimo operatorių
  • Konvertavimas naudojant „Cast“ operatorių

Įveskite Conversion naudodami priskyrimo operatorių C++

Tipo konvertavimas naudojant priskyrimo operatorių atliekamas priverstinai, ty vienas duomenų tipas į kitą konvertuojamas rankiniu būdu. Tai atliekama naudojant priskyrimo operatorių „=“, kuris dešiniojo operando reikšmę priskiria kintamajam kairėje pusėje.

Pavyzdys
Ši programa apskaičiuoja apskritimo plotą naudodama tipo liejimą.

#include
#include
naudojant vardų erdvė std ;
tarpt pagrindinis ( )
{
tarpt spindulys ;
cout <> spindulys ;
plūdė plotas = M_PI * spindulys * spindulys ;
cout << 'Apskritimo plotas su spinduliu' << spindulys << '=' << plotas ;
}

Priskyrimo operatorius naudojamas priskirti slankiąją reikšmę sričiai, kurią sudaro sveikojo skaičiaus duomenų tipo spindulio reikšmė.

Apskritimo plotas grąžinamas plūduriuojančių duomenų tipu, o spindulys įvedamas sveikojo skaičiaus duomenų tipu. Taigi, kintamojo duomenų tipas keičiamas naudojant tipo liejimą naudojant priskyrimo operatorių.

Įveskite konvertavimą naudodami perdavimo operatorių C++

Tipo konvertavimas atliekamas naudojant cast operatorių, kuris priverčia vieną duomenų tipą pakeisti į kitą tipą pagal programos poreikius.

Yra keturi skirtingi Cast operatoriai:

  • statinis_perdavimas
  • const_cast
  • dinaminis_perdavimas
  • reinterpret_cast

1: statinis_perdavimas

Static_cast yra perdavimo operatorius, kuris naudojamas aiškiai konvertuoti plūdes ir simbolius į sveikuosius skaičius ir pan. Tai pats paprasčiausias liejimo operatorius. Jis gali perduoti duomenų tipus, kurie yra panašūs. Jis gali konvertuoti rodykles iš vienos formos į kitą, todėl taip pat gali būti naudojamas atminties valdymui.

Sintaksė

statinis_perdavimas ( išraiška )

Pavyzdys
Ši programa sukurta siekiant konvertuoti dvigubą kintamąjį į int duomenų tipą naudojant static_cast. Jis nukirs bet kokią dešimtainę dalį išvestyje.

#include
naudojant vardų erdvė std ;
tarpt pagrindinis ( )
{
// deklaruoti kintamąjį
dvigubai p ;
p = 2 905 * 1 235 * 24 675 ;
plūdė rezultatas ;

cout << 'Prieš naudodami statinį atvaizdą:' << endl ;
cout << ' p reikšmė = ' << p << endl ;

// naudokite static_cast duomenų tipui konvertuoti
rezultatas = statinis_perdavimas ( p ) ;
cout << 'Panaudojus statinį atvaizdą:' << endl ;
cout << 'Rezultato reikšmė =' << rezultatas << endl ;

grąžinti 0 ;
}

Iš pradžių į dvigubą kintamąjį p įkeliamos reikšmės, kurios padauginamos viena iš kitos ir išsaugomos rezultate. Rezultate pateikiamas rezultatas prieš ir po operatorių static_cast:

Prieš naudojant static_cast operatorių, rezultatas rodomas dešimtainiais kableliais, o panaudojus šį operatorių – sveikojo skaičiaus duomenų tipu.

2: const_cast

Const_cast operatorius naudojamas pastoviai objekto vertei konvertuoti į nepastovią tipą. Jis naudojamas, kai deklaruojamas pastovus objektas, ir mes turime retkarčiais pakeisti jo vertę.

Sintaksė

const_cast ( išraiška )

Pavyzdys
Šiame pavyzdyje operatorius const_cast naudojamas nuolatiniam kvalifikatoriui laikinai pašalinti ir leidžia keisti kintamąjį pagal poreikį:

#include
naudojant vardų erdvė std ;
tarpt pagrindinis ( ) {
konst tarpt x = 70 ;
konst tarpt * ir = & x ;
cout << 'Sena vertė yra' << * ir << \n ;
tarpt * Su = const_cast ( ir ) ;
* Su = 90 ;
cout << 'Nauja vertė yra' << * ir ;
grąžinti 0 ;
}

Pastovus kvalifikatorius priskiriamas int kintamajam x, o tai reiškia, kad šio kintamojo negalima tiesiogiai keisti. Po to int *y, kuris yra rodyklė, naudojamas norint pasiekti x, bet vis tiek jo negalima pakeisti, o pradinė vertė rodoma naudojant cout. Naudojant operatorių const_cast, sukuriamas žymeklis z, kuris yra nepastovus, jis naudojamas norint pasiekti x reikšmę, todėl ją galima redaguoti. Jis pakeičia z priskirtą reikšmę su 90, o tai netiesiogiai keičia reikšmę x.

Iš pradžių pastovaus kintamojo x reikšmė yra 70, kuri modifikuojama naudojant operatorių const_cast, todėl ji yra 90.

3: dinaminis_perdavimas

su paveldėjimo hierarchija, kuri taip pat vadinama saugaus tipo nuleidimu. Nuleidimas žemyn – tai nuorodos arba rodyklės konvertavimo į išvestinę klasę iš bazinės klasės nuorodos arba rodyklės procesas.

Sintaksė

dinaminis_perdavimas ( išraiška )

Pavyzdys
Šiame pavyzdyje operatorius dynamic_cast naudojamas polimorfinės klasės tipui patikrinti ir leidžia pasiekti tiek bazinės, tiek išvestinės klasės narius.

#include
#įtraukti
naudojant vardų erdvė std ;
klasė TBase
{
viešas :
plūdė bazė_g = 9.81 ;

virtualus tuštuma manekenas ( )
{

} ;
} ;

klasė TIšvestinė : viešas TBase
{
viešas :
tarpt vietinis_g = 9.78 ;
} ;

tarpt pagrindinis ( )
{

TBase * bazė = naujas TIšvestinė ;
TIšvestinė * išvestinė ;

išvestinė = dinaminis_perdavimas ( bazė ) ;

cout < bazė_g << endl ;
cout < vietinis_g << endl ;

getchar ( ) ;
grąžinti 0 ;
}

Dvi klasės apibrėžiamos kaip pagrindinės ir išvestinės klasės. Sukuriama TBase* tipo rodyklės bazė ir priskiriama dinamiškai paskirstytam TDerived tipo objektui. Išvestinės klasės objektas gali būti priskirtas pagrindinės klasės žymekliui šiuo polimorfizmo atveju. Dynamic_cast patikrina, ar žymeklis pasiekia galiojantį TDerived objektą, jei perdavimas gauna sėkmingą rezultatą, išvestinė klasė gaus tinkamą rezultatą, kitaip ji grąžins nulinę reikšmę.

4: reinterpret_cast

Reinterpret_cast paverčia vieno duomenų tipo žymeklį į kito duomenų tipo rodyklę. Ji netikrina, ar rodyklių duomenų tipai yra vienodi, ar ne. Šį liejimo operatorių reikia naudoti ir su juo elgtis atsargiai.

Pavyzdys
Šioje iliustracijoje vieno duomenų tipo rodyklė iš naujo interpretuojama į kito duomenų tipo žymeklį naudojant reinterpret_cast:

#include
naudojant vardų erdvė std ;

tarpt pagrindinis ( )
{
tarpt * q = naujas tarpt ( 70 ) ;
char * sk = reinterpret_cast ( q ) ;
cout << * q << endl ;
cout << * sk << endl ;
cout << q << endl ;
cout << sk << endl ;
grąžinti 0 ;
}

Iš pradžių sveikasis skaičius priskiriamas reikšmei 70. Rodyklė q nurodo šį dinamiškai priskirtą sveikąjį skaičių. Reinterpret_cast naudojamas norint iš naujo interpretuoti žymeklį q kaip simbolio žymeklį ch, o tai reiškia, kad atmintis, iš pradžių priskirta q, dabar traktuojama taip, lyg tai būtų simbolis. Naudodamas komandą cout, jis išspausdina reikšmę, priskirtą q ir ch. Kadangi ch traktuojamas kaip simbolio rodyklė, jis grąžins simbolio reikšmę.

Jis atspausdina reikšmę, nurodytą ch, naudojant *ch. Tačiau kadangi ch traktuojamas kaip simbolio rodyklė, ši eilutė interpretuos atmintį kaip simbolį. Jis išspausdina atminties adresą, saugomą žymeklyje ch, naudodamas ch. Tai yra tas pats atminties adresas kaip q, nes tai tik tos pačios atminties interpretacija.

Iš pradžių sveikasis skaičius išsaugo 70. Vėliau tai manipuliuojama tarp rodyklės q ir rodyklės ch. 2 ir 4 išėjimai yra tokie patys, nes antroji reikšmė iš naujo interpretuojama naudojant reinterpret_cast.

Pastaba : Siūloma nenaudoti šio liejimo operatoriaus, kol ir nebent to labai reikia, nes dėl to objektas tampa nenešiojamu gaminiu

Išvada

Vieno kintamojo duomenų tipo keitimo į kitą procesas C++ yra žinomas kaip tipo konvertavimas arba tipo liejimas. Tai atliekama norint atlikti matematines operacijas su skirtingų duomenų tipų kintamaisiais, suderinant jų duomenų tipus tarpusavyje. Tipo konvertavimas optimizuoja kodą. C++ yra numanomos ir aiškios tipo konversijos. Netiesioginį tipo konvertavimą atlieka pats kompiliatorius, naudodamas iš anksto nustatytą taisyklių rinkinį, o aiškų tipo konvertavimą atlieka programuotojas, naudodamas priskyrimo operatorius ir perdavimo operatorius.