type conversions c
Pogledajte različite pretvorbe tipova podržane u C ++.
Nadamo se da biste trebali biti svjesni svih vrsta podataka dostupnih u C ++-u iz naših ranijih vodiča. Ponekad se može pojaviti potreba da moramo pretvoriti jedan tip u drugi. To se naziva pretvorba tipa ili lijevanje tipa.
U ovom uputstvu raspravljat ćemo o različitim pretvorbama tipova podržanih u C ++.
najbolje uklanjanje zlonamjernog softvera za Windows 7
=> Kliknite ovdje za besplatni tečaj C ++.
Što ćete naučiti:
- Pretvorbe tipa
- Implicitna konverzija
- Eksplicitna konverzija
- Vrste lijevanja
- Zaključak
- Preporučena literatura
Pretvorbe tipa
C ++ podržava dvije vrste pretvorbe tipova:
- Implicitna pretvorba tipa: Implicitna pretvorba tipa je automatska. Korisnik ne ometa ovu vrstu pretvorbe, a prevoditelj izravno vrši pretvorbu. Pretvorba se obično vrši kada u izrazu postoji više vrsta podataka. Ali općenito, kod ove vrste pretvorbe postoji mogućnost gubitka podataka, gubitka znakova ili prekomjernog prekomjernog podataka.
- Eksplicitna pretvorba tipa: Eksplicitna pretvorba tipa definirana je od strane korisnika i obično se naziva 'lijevanje tipa'. Ovdje korisnik emitira ili pretvara vrijednost jednog tipa podataka u drugi, ovisno o zahtjevima. Ovakve su pretvorbe sigurnije.
Sada ćemo detaljno vidjeti obje vrste pretvorbe tipova.
Implicitna konverzija
U implicitnoj pretvorbi, prevodilac vrši pretvorbe iz jednog tipa podataka u drugi kad god izraz ima više vrsta podataka. Kako bi se spriječio gubitak podataka, sve varijable ostalih tipova podataka pretvaraju se u najveći tip podataka. To se zove promocija.
Dopustite nam da razumijemo implicitnu pretvorbu pomoću primjera koda.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Izlaz:
10 + 'A' = 75
plutajući val (10 + ‘a’) = 107
var_int = 1000
Gornji primjer koda pokazuje implicitnu pretvorbu. Proglasili smo cijelu vrijednost i znakovnu varijablu s vrijednostima 10, odnosno 'A'. Kad zbrojimo ove dvije varijable, događa se implicitna pretvorba.
Kako je cijeli broj veći izraz u ovom izrazu, vrijednost varijable znaka ‘A’ pretvara se u svoj cjelobrojni ekvivalent tj. Vrijednost 65 (ASCII vrijednost). Tako je rezultat izraza 75.
U sljedeći izraz dodajemo cijeli broj i znak (‘a’ -> 97), a zatim dodijelimo rezultat plutajućem. Dakle, prevodilac rezultat izraza implicitno pretvara u float.
U trećem izrazu kratka int varijabla implicitno se pretvara u cijeli broj.
Bilješka : U slučaju implicitnih pretvorbi, ako kompajler otkrije potencijalni gubitak podataka, tada bi moglo bljesnuti upozorenje u tom smislu.
Eksplicitna konverzija
Eksplicitna pretvorba poznata je i pod nazivom 'lijevanje tipa' jer 'prebacujemo' jedan tip podataka u drugi tip podataka. Ovdje korisnici izričito definiraju lijevanje, za razliku od implicitne konverzije gdje prevodilac interno vrši konverziju.
Eksplicitnu pretvorbu možemo izvesti na dva načina:
# 1) Korištenje operatora dodjele
Eksplicitna pretvorba ili tipiziranje pomoću operatora dodjele na neki se način izvodi snažno. Ovdje emitiramo ili pretvaramo jedan tip podataka u drugi tip podataka pomoću operatora dodjele.
Općenita sintaksa je:
(data type) expression;
Sljedeći primjer to objašnjava:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Izlaz:
Zbroj = 5563
Comp = 5563,2
10 najboljih špijunskih aplikacija za android
U gornjem smo primjeru prikazali eksplicitno lijevanje pomoću operatora dodjele. Prvo, varijabnu plaću tipa double premještamo u cijeli broj. Dalje, cjelobrojnu varijablu zbrojamo u dvostruki tip.
Kao što je prikazano u izlazu, tip na koji emitiramo ukazuje na konačni tip rezultata izraza.
To je povoljno jer korisnik može promijeniti vrstu izraza prema zahtjevima.
# 2) Korištenje Cast Operator
U ovoj vrsti lijevanja koristimo 'operatora lijevanja' koji je unarni operator za promjenu s jedne vrste na drugu.
Vrste lijevanja
Imamo sljedeće vrste lijevanja, ovisno o operateru lijevanja kojeg koristimo:
# 1) Statična uloga
Statična cast je najjednostavnija među svim vrstama tipova pomoću operatora cast . Statična cast može izvesti sve konverzije koje se implicitno izvrše. Također izvodi pretvorbe između pokazivača klasa međusobno povezanih (nadograđeno -> od izvedenog do baze ili spušteno -> od baze do izvedenoga).
Osim gore navedenih pretvorbi, statičko lijevanje također može pretvoriti bilo koji pokazivač u void *.
Statička postava je sastavljena vremenska postava. To znači da tijekom izvršavanja nije izvršena provjera je li izvedena uloga valjana ili ne. Stoga je odgovornost programera da osigura da je pretvorba bila sigurna i valjana.
Drugim riječima, korisnik mora osigurati da je pretvoreni objekt bio pun s obzirom na odredišni tip podataka.
Mi određujemo statički odljev kako slijedi:
static_cast (expression)
Dopustite nam da razumijemo statičku glumačku postavu na primjeru.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<U gornjem primjeru malo smo izmijenili kôd tako da uključuje znakovnu varijablu s vrijednošću 'A'. Zatim deklariramo cjelobrojni pokazivač i primjenjujemo statički ulog za pretvaranje znaka u cjelobrojni pokazivač.
Kad kompajliramo ovaj program, dobivamo sljedeći izlaz.
U funkciji ‘int main ()’:
10:35: pogreška: nevaljani static_cast iz tipa 'char *' u tip 'int *'
Program daje pogrešku za izvedeni statički prijenos jer je nevaljan. Stoga statična cast omogućuje samo valjano lijevanje tipa ili pretvorbe i daje pogrešku kada pokušamo izvršiti neko neželjeno slanje tipova.
# 2) Dinamično emitiranje
Dinamična cast je izvedba koja se izvodi za provjeru valjanosti cast. Dinamična uloga izvodi se samo na pokazivačima i referencama razreda. Izraz vraća NULL vrijednost ako emitiranje ne uspije.
Dinamična cast koristi mehanizam poznat kao RTTI (identifikacija tipa izvođenja) . RTTI čini sve informacije o tipu podataka objekta dostupnim tijekom izvođenja i dostupan je samo za klase koje imaju barem jednu virtualnu funkciju (polimorfni tip). RTTI omogućuje određivanje vrste objekta u vrijeme izvođenja ili u vrijeme izvršenja.
Pokušajmo s jednim primjerom kako bismo razumjeli dinamičnu glumačku postavu.
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
U ovom smo programu definirali dvije klase, bazu s virtualnom funkcijom i izvedene s osnovnom klasom, bazom.
U glavnoj funkciji kreiramo izvedeni objekt klase na koji pokazuje pokazivač osnovne klase. Zatim izvodimo dynamic_cast na osnovnom pokazivaču ukazujući na izvedenu klasu kako bi ga prebacili na izvedeni pokazivač klase.
Kao i u osnovnoj klasi, baza je polimorfna (sadrži virtualnu funkciju), Dynamiccast je uspješan.
Bilješka: Ako uklonimo virtualnu funkciju iz gornje klase, tada Dynam_cast neće uspjeti jer RTTI podaci za objekte neće biti dostupni.
Dinamična glumačka postava ima glavnu sigurnost u tipu tijekom izvođenja.
# 3) Ponovo protumačite Cast
Ova vrsta odljeva je najopasnija za uporabu jer djeluje na bilo kojoj vrsti predmeta, a da klase nisu međusobno povezane.
Reintepret_cast radi na bilo kojim pokazivačima i pretvara pokazivač bilo kojeg tipa u bilo koji drugi tip, bez obzira na to jesu li pokazivači međusobno povezani ili ne. Ne provjerava jesu li pokazivač ili podaci na koje pokazuje pokazivač isti ili ne.
Operator emitiranja uzima samo jedan parametar, izvorni pokazivač za pretvaranje i ne vraća nikakvu vrijednost. Jednostavno pretvara tip pokazivača.
Ne bismo trebali koristiti ako nije potrebno. Izvorni pokazivač obično tipkamo na njegov izvorni tip.
Uglavnom radimo s bitovima. Kada se koristi na logičkim vrijednostima, logičke vrijednosti pretvaraju se u cjelobrojne vrijednosti, tj. 1 za true i 0 za false.
Pogledajmo primjer tumačenja glumačke postave:
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
Izlaz:
0x3ef3090
do
97
do
U gornjem primjeru proglasili smo cjelobrojni pokazivač ptr koji pokazuje na vrijednost 97. Dalje, deklariramo pokazivač znakova ch i dodamo ptr na njega pomoću.
Dalje, ispisujemo razne vrijednosti. Prvo što ispisujemo je ptr koji upućuje na cijelo mjesto. Stoga ispisuje adresu.
Sljedeća vrijednost ch sadrži vrijednost 97 i stoga ispisuje 'a' što je ASCII ekvivalent 97. Sljedeća vrijednost '* ptr' sadrži vrijednost 97 dok '* ch' ima ASCII ekvivalent 97, tj. 'A' dok je lijevala pomoću reinterpret_cast.
# 4) Const Cast
Operator emitiranja koristi se za promjenu ili manipulaciju čvrstoće izvornog pokazivača. Pod manipulacijom podrazumijevamo da može biti ili postavljanje constness na non-const pokazivač ili uklanjanje constness iz const pokazivača.
Uvjet za uspješno postavljanje operatora je da pokazivač i izvor koji se emitiraju trebaju biti istog tipa.
Uzmimo primjer da to shvatimo.
youtube u mp3 pretvarač s uređivačem oznaka
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
U ovom primjeru vidimo da funkcija ‘printVal’ prihvaća pokazivač koji nije const. U glavnoj funkciji imamo const varijablu ‘value’ dodijeljenu const pokazivaču ptr.
Da bismo ovaj const pokazivač proslijedili funkciji printVal, emitirali smo ga primjenom kako bismo uklonili constness. Zatim prenosimo pokazivač ptr_cast funkciji da bismo dobili željene rezultate.
Zaključak
Ovim ćemo završiti ovu temu pretvorbe tipa u C ++. Vidjeli smo sve o implicitnim i eksplicitnim pretvorbama koje se koriste u C ++.
Međutim, treba biti svjestan da bi se spriječilo gubljenje podataka i druge takve poteškoće, pretvorbe ili tipiziranje treba pametno primijeniti samo ako situacija zahtijeva upotrebu.
=> Ovdje pripazite na Vodič za obuku za početnike C ++.
Preporučena literatura
- Najbolji BESPLATNI vodiči za C #: Krajnji vodič za C # za početnike
- Upišite kvalifikacije i klase pohrane u C ++
- Vrste testiranja migracije: sa scenarijima ispitivanja za svaku vrstu
- Kako odlučiti koja je vrsta testiranja potrebna za projekt? - Ručno ili automatizacija
- Vrste podataka C ++
- Ispitivanje opterećenja pomoću HP LoadRunner vodiča
- Varijable u C ++
- Predlošci na C ++ s primjerima