Kuidas teisendada andmetüüpe C++-s

Kuidas Teisendada Andmetuupe C S



Ühe muutuja andmetüübi teiseks muutmise protsessi nimetatakse C++ keeles tüübi teisendamiseks või tüübi valamiseks. Seda tehakse erinevate andmetüüpide muutujatega matemaatiliste toimingute tegemiseks, muutes nende andmetüübid üksteisega ühilduvaks. Tüübi teisendamine optimeerib koodi. Näiteks kahe muutuja erinevuse arvutamisel, kui üks arv on ujukitüüpi ja teine ​​täisarvu tüüpi andmetüübis, teisendatakse lahutamise teostamiseks täisarvuline andmetüüp ujukitüübiks.

Kuidas teisendada andmetüüpe C++-s

C++-s on andmetüüpide muutmiseks kaks võimalust:

Kaudne tüübi teisendamine

Vastavalt C++ koodikompilaatori eelmääratletud reeglitele on kaudne tüübikonversioon tüübiteisendus, mille kompilaator teostab automaatselt, ilma et oleks vaja kasutajalt mingit välist käivitajat. Seda tüüpi teisendamine toimub programmis tavaliselt siis, kui andmetüüpe on rohkem kui üks ja avaldise andmetüüp ei ühti selles avaldises osaleva muutuja andmetüübiga.







Andmete kadumise vältimiseks teisendamise ajal muudab kompilaator vaikimisi madala täpsusega andmetüüpi suurema täpsusega andmetüübiga. Näiteks teisendab see täisarvu ujukiks, mitte ei muudaks ujukit täisarvuks, et vältida andmete kadumist. Seda nimetatakse edutamiseks. Järgnevalt on toodud erinevate andmetüüpide prioriteetsuse diagramm.





Tellimus tüübi teisendamiseks

Tüübi teisendamise õige järjekord on esitatud järgmiselt:





bool -- > char -- > lühike int -- > int -- > allkirjastamata int -- > pikk -- > allkirjastamata pikk -- > pikk pikk -- > ujuk -- > kahekordne -- > pikk topelt

Madala täpsusega tüüpi muutuja teisendatakse suure täpsusega andmetüübiks, et vältida andmete kadumist.

Näide 1

Selles näites lisatakse erinevate andmetüüpide muutuja, kasutades kaudset tüübi teisendust.



#include
kasutades nimeruum std ;

int peamine ( ) {
int number = 100 ;
char iseloomu = 'C' ;
cout << '100 + 'C' = ' << number + iseloomu << endl ;

ujuk val = number + 'c' ;
cout << 'float val(100 + 'c') = ' << val << endl ;

int oli = 7890 ;
pikk ei olnud = oli ;
cout << 'var_int =' << ei olnud ;
tagasi 0 ;
}

Siin lisatakse täisarv ja märk ASCII tabelist ning ujukarv ja märk 'c'. Täisarvu hoitakse kolmandas segmendis pika andmetüübina ja andmetüüpe muudab kompilaator ise oma etteantud reeglite alusel.

100 ja 'C' summa tagastab 167, kuna 'C' võrdub numbritega 67-ga ja 100+'c' tagastab 199, kuna väiketähtedega 'c' võrdub 99-ga. Muutuja int salvestatakse pika andmetüübina.

Näide 2

Selles näites teisendatakse jagamise toimingu tegemiseks täht D ujukiks.

#include
kasutades nimeruum std ;

int peamine ( ) {
char x = 'D' ;

ujuk float_var ;

float_var = ujuk ( x ) / 'c' ;
// Int-i selgesõnaline teisendamine ujukiks.

cout << 'Paramendi float_var väärtus on: ' << float_var << endl ;

tagasi 0 ;
}

Sisendväärtus on tähemärgi D kujul, mis salvestatakse ujukandmetüübis ja jagatakse edasi märgiga C. Need märgid muudetakse arvväärtusteks ja nendega tehakse jagamisoperatsioon, mis tagastab väärtuse ujuvvormingus.

Selgesõnaline tüübi teisendus

Kasutaja peab andmetüüpi käsitsi muutma C++ selgesõnalise tüübi teisendusega, mida sageli nimetatakse tüübi valamiseks. Seda tüüpi valamine tehakse kaudse tüübi teisendamise vältimiseks. C++-s selgesõnalise tüübi ülekandmiseks on kaks meetodit:

  • Teisendamine määramisoperaatori abil
  • Teisendamine Cast Operatori abil

Tippige C++ määramisoperaatori abil käsk Conversion

Tüübi teisendamine määramisoperaatori abil toimub jõuliselt, st üks andmetüüp teisendatakse teiseks käsitsi. See saavutatakse määramisoperaatori '=' abil, mis määrab parempoolse operandi väärtuse selle vasakul küljel olevale muutujale.

Näide
See programm arvutab ringi pindala tüübivalu abil.

#include
#include
kasutades nimeruum std ;
int peamine ( )
{
int raadius ;
cout <> raadius ;
ujuk ala = M_PI * raadius * raadius ;
cout << 'Ringi pindala raadiusega' << raadius << '=' << ala ;
}

Määramisoperaatorit kasutatakse piirkonnale ujuväärtuse määramiseks, mis koosneb täisarvulise andmetüübi raadiuse väärtusest.

Ringi pindala tagastatakse ujuvandmete tüübis, raadius aga täisarvulise andmetüübina. Seega muudetakse muutuja andmetüüpi tüübi ülekandmise teel, kasutades määramisoperaatorit.

Tippige C++ ülekandeoperaatori abil teisendamine

Tüübi teisendamine toimub cast-operaatori abil, mis sunnib üht andmetüüpi vastavalt programmi vajadustele teise tüübi vastu muutma.

Seal on neli erinevat ülekandeoperaatorit:

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

1: static_cast

Static_cast on ülekandmise operaator, mida kasutatakse ujukite ja märkide selgesõnaliseks teisendamiseks täisarvudeks ja nii edasi. See on kõige elementaarsem cast-operaator. See võib edastada oma olemuselt sarnaseid andmetüüpe. See võib teisendada viiteid ühest vormist teise, nii et seda saab kasutada ka mälu haldamiseks.

Süntaks

static_cast ( väljendus )

Näide
See programm on loodud kahe muutuja teisendamiseks int-andmetüübiks, kasutades static_cast. See katkestab väljundis kõik kümnendkohad.

#include
kasutades nimeruum std ;
int peamine ( )
{
// deklareerige muutuja
kahekordne lk ;
lk = 2 905 * 1,235 * 24 675 ;
ujuk tulemus ;

cout << 'Enne staatilise ülekande kasutamist:' << endl ;
cout << ' P väärtus =' << lk << endl ;

// kasutage andmetüübi teisendamiseks parameetrit static_cast
tulemus = static_cast ( lk ) ;
cout << 'Pärast staatilise heide kasutamist:' << endl ;
cout << ' Tulemuse väärtus = ' << tulemus << endl ;

tagasi 0 ;
}

Esialgu laetakse topeltmuutuja p väärtustega, mis korrutatakse omavahel ja salvestatakse tulemusesse. Tulemus sisaldab tulemust enne ja pärast operaatorit static_cast:

Enne operaatori static_cast kasutamist kuvatakse tulemus kümnendkohtades, pärast selle operaatori kasutamist aga täisarvulise andmetüübina.

2: const_cast

Operaatorit const_cast kasutatakse objekti konstantse väärtuse teisendamiseks mittekonstantseks tüübiks. Seda kasutatakse siis, kui deklareeritakse konstantne objekt ja me peame selle väärtust aeg-ajalt muutma.

Süntaks

const_cast ( väljendus )

Näide
Selles näites kasutatakse operaatorit const_cast konstantse kvalifikaatori ajutiselt eemaldamiseks ja see võimaldab muutujas vastavalt vajadusele muudatusi teha:

#include
kasutades nimeruum std ;
int peamine ( ) {
konst int x = 70 ;
konst int * ja = & x ;
cout << 'Vana väärtus on' << * ja << ' \n ' ;
int * Koos = const_cast ( ja ) ;
* Koos = 90 ;
cout << 'Uus väärtus on' << * ja ;
tagasi 0 ;
}

Konstantne kvalifikaator on määratud int muutujale x, mis tähendab, et seda muutujat ei saa otse muuta. Pärast seda kasutatakse x-ile juurdepääsuks int *y, mis on kursor, kuid seda ei saa siiski muuta ja selle algväärtus kuvatakse kasutades cout. Operaatori const_cast abil luuakse mittekonstantne osuti z, mida kasutatakse x väärtusele juurdepääsuks, muutes selle redigeeritavaks. See muudab z-le määratud väärtust 90-ga, mis muudab kaudselt väärtust x-is.

Esialgu on konstantse muutuja x väärtus 70, mida muudetakse operaatori const_cast abil, muutes selle väärtuseks 90.

3: dynamic_cast

pärimishierarhiaga, mida nimetatakse ka tüübikindlaks langetamiseks. Allalaadimine on protsess, mille käigus teisendatakse viide või osuti baasklassi viitest või osutist tuletatud klassiks.

Süntaks

dynamic_cast ( väljendus )

Näide
Selles näites kasutatakse polümorfse klassi tüübi kontrollimiseks operaatorit dynamic_cast ja see võimaldab juurdepääsu nii põhi- kui ka tuletatud klassi liikmetele.

#include
#kaasa
kasutades nimeruum std ;
klass TBase
{
avalik :
ujuk alus_g = 9.81 ;

virtuaalne tühine mannekeen ( )
{

} ;
} ;

klass TTuletatud : avalik TBase
{
avalik :
int kohalik_g = 9.78 ;
} ;

int peamine ( )
{

TBase * alus = uus TTuletatud ;
TTuletatud * tuletatud ;

tuletatud = dynamic_cast ( alus ) ;

cout < alus_g << endl ;
cout < kohalik_g << endl ;

getchar ( ) ;
tagasi 0 ;
}

Kaks klassi on määratletud põhi- ja tuletatud klassidena. Luuakse TBase* tüüpi kursoribaas, mis määratakse dünaamiliselt jaotatud TDerived-tüüpi objektile. Sellel polümorfismijuhul saab baasklassi osutile määrata tuletatud klassiobjekti. Dynamic_cast kontrollib, kas kursor pääseb juurde TDerived kehtivale objektile, kui ülekandmine saab eduka tulemuse, saab tuletatud klass kehtiva tulemuse, vastasel juhul tagastab nullväärtuse.

4: reinterpret_cast

Reinterpret_cast teisendab ühte andmetüüpi kursori erinevat tüüpi andmetüübiks. See ei kontrolli, kas osutite andmetüübid on samad või mitte. Seda valuoperaatorit tuleb kasutada ja käsitseda ettevaatlikult.

Näide
Sellel joonisel tõlgendatakse ühe andmetüübi kursor ümber teise andmetüübi kursoriks, kasutades reinterpret_cast:

#include
kasutades nimeruum std ;

int peamine ( )
{
int * q = uus int ( 70 ) ;
char * ptk = reinterpret_cast ( q ) ;
cout << * q << endl ;
cout << * ptk << endl ;
cout << q << endl ;
cout << ptk << endl ;
tagasi 0 ;
}

Algselt määratakse täisarv väärtusega 70. Osuti q osutab sellele dünaamiliselt eraldatud täisarvule. Reinterpret_cast kasutatakse osuti q ümbertõlgendamiseks märgi osutiks ch, mis tähendab, et algselt q-le määratud mälu käsitletakse nüüd nii, nagu oleks see märk. Kasutades käsku cout, prindib see q-le ja ch-le määratud väärtuse. Kuna ch-d käsitletakse märgiosutajana, tagastab see märgi väärtuse.

See prindib väärtuse, mis osutab ch-le, kasutades *ch. Kuna aga ch-d käsitletakse märgiosutajana, tõlgendab see rida mälu märgina. See prindib kursorisse ch salvestatud mäluaadressi kasutades ch. See on sama mäluaadress mis q, kuna see on lihtsalt sama mälu ümbertõlgendus.

Algselt salvestab täisarv 70. Hiljem manipuleeritakse seda osuti q ja osuti ch vahel. Väljundid 2 ja 4 on samad, kuna teine ​​väärtus tõlgendatakse ümber, kasutades reinterpret_cast.

Märge : Soovitatav on mitte kasutada seda cast-operaatorit enne ja välja arvatud juhul, kui see on väga vajalik, kuna see muudab objekti mittekaasaskantavaks tooteks

Järeldus

Ühe muutuja andmetüübi teiseks muutmise protsessi nimetatakse C++ keeles tüübi teisendamiseks või tüübi valamiseks. Seda tehakse erinevate andmetüüpide muutujatega matemaatiliste toimingute tegemiseks, muutes nende andmetüübid üksteisega ühilduvaks. Tüübi teisendamine optimeerib koodi. C++-s on kaudsed ja selgesõnalised tüübikonversioonid. Kaudse tüübi teisenduse viib läbi kompilaator ise, kasutades eelnevalt määratletud reeglite kogumit, samas kui selgesõnalise tüübi teisenduse teostab programmeerija, kasutades määramisoperaatoreid ja castoperaatoreid.