type conversions c
Oglejte si različne pretvorbe tipov, podprte v jeziku C ++.
Upamo, da bi morali poznati vse vrste podatkov, ki so na voljo v C ++ iz naših prejšnjih vadnic. Včasih se lahko pojavi potreba, da moramo eno vrsto pretvoriti v drugo. To se imenuje pretvorba tipa ali vlivanje tipa.
V tej vadnici bomo obravnavali različne pretvorbe tipov, ki jih podpira C ++.
osnovni programi Java, vprašani v intervjujih
=> Kliknite tukaj za brezplačni tečaj C ++.
Kaj se boste naučili:
Pretvorbe tipa
C ++ podpira dve vrsti pretvorbe tipov:
- Implicitna pretvorba tipa: Implicitna pretvorba tipa je samodejna. Uporabnik pri tej vrsti pretvorbe ne posega in prevajalnik neposredno izvede pretvorbo. Pretvorba se običajno izvede, če je v izrazu več podatkov. Toda na splošno pri tej vrsti pretvorbe obstaja možnost izgube podatkov, izgube znakov ali prelivanja podatkov.
- Izrecna pretvorba tipa: Izrecna pretvorba tipa je uporabniško določena in se običajno imenuje 'vlivanje vrst'. Tu uporabnik odda ali pretvori vrednost enega podatkovnega tipa v drugega, odvisno od zahtev. Tovrstne pretvorbe so varnejše.
Zdaj bomo podrobno videli obe vrsti pretvorbe vrst.
Implicitna pretvorba
Pri implicitni pretvorbi prevajalnik izvede pretvorbe iz enega podatkovnega tipa v drugega, kadar ima izraz več kot en podatkovni tip. Da bi preprečili izgubo podatkov, se vse spremenljivke drugih podatkovnih vrst pretvorijo v največji podatkovni tip. To se imenuje napredovanje.
Razumejmo implicitno pretvorbo z uporabo kode.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Izhod:
10 + 'A' = 75
plavajoči val (10 + ‘a’) = 107
var_int = 1000
Zgornji primer kode prikazuje implicitno pretvorbo. Deklarirali smo celo število in spremenljivko znakov z vrednostjo 10 oziroma 'A'. Ko seštejemo ti dve spremenljivki, pride do implicitne pretvorbe.
Ker je celo število v tem izrazu večja vrsta, se spremenljivka znaka 'A' pretvori v celoštevilčni ekvivalent, to je vrednost 65 (vrednost ASCII). Rezultat izraza je torej 75.
V naslednjem izrazu dodamo celo število in znak (‘a’ -> 97) in rezultat dodelimo lebdečemu. Tako prevajalnik rezultat izraza implicitno pretvori v float.
V tretjem izrazu se kratka spremenljivka int implicitno pretvori v celo število.
Opomba : V primeru implicitnih pretvorb, če prevajalnik zazna potencialno izgubo podatkov, bo morda utripalo opozorilo.
Izrecna pretvorba
Izrecna pretvorba je znana tudi kot 'vlivanje vrst', saj en podatkovni tip 'prelijemo' v drugega. Tu uporabniki izrecno definirajo ulivanje, za razliko od implicitne pretvorbe, kjer prevajalnik interno izvede pretvorbo.
Izrecno pretvorbo lahko izvedemo na dva načina:
# 1) Uporaba operaterja dodelitve
Izrecna pretvorba ali napovedovanje tipov z uporabo operatorja dodelitve se na nek način izvaja prisilno. Tu z uporabo operaterja dodelitve pretvorimo ali pretvorimo en podatkovni tip v drugega.
Splošna sintaksa je:
Vprašanja in odgovori za php intervju za 2-letne izkušnje
(data type) expression; Naslednji primer to pojasnjuje:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Izhod:
Vsota = 5563
Comp = 5563,2
V zgornjem primeru smo prikazali eksplicitno predvajanje z uporabo operaterja dodelitve. Najprej spremenljivo plačo tipa double pretvorimo v celoštevilčno vrsto. Nato celoštevilčno spremenljivko vsoto vržemo v dvojni tip.
Kot je prikazano v izhodu, tip, ki ga oddajamo, označuje končni tip rezultata izraza.
To je ugodno, saj lahko uporabnik spremeni vrsto izraza v skladu z zahtevami.
# 2) Uporaba Cast Operatorja
Pri tej vrsti ulivanja uporabljamo 'operaterja zasedbe', ki je unarni operater za prehod iz ene vrste v drugo.
Vrste litja
Odvisno od operaterja zasedbe, ki ga uporabljamo, imamo naslednje vrste odlitkov:
# 1) Statična igralska zasedba
Statična igralska zasedba je najpreprostejša med vsemi vrstami oddajanja z uporabo operaterja oddaje . Statični zasedba lahko izvede vse pretvorbe, ki se izvedejo implicitno. Izvaja tudi pretvorbe med kazalci razredov, ki so med seboj povezani (upcast -> iz izpeljanega v osnovni ali navzdol -> iz osnovnega v izpeljani).
Poleg zgoraj naštetih pretvorb lahko statični oddaj tudi pretvori kateri koli kazalec v void *.
Statična zasedba je sestavljena časovna zasedba. To pomeni, da med izvajanjem ni preverjanja, ali je izvedena igralska zasedba veljavna ali ne. Tako ostaja odgovornost programerja, da zagotovi, da je bila pretvorba varna in veljavna.
Z drugimi besedami, uporabnik mora zagotoviti, da je bil pretvorjeni objekt glede na ciljni podatkovni tip poln.
Določimo statično zasedbo, kot sledi:
static_cast (expression) Dovolite nam, da razumemo statično zasedbo na primeru.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<V zgornjem primeru smo kodo nekoliko spremenili tako, da vključuje spremenljivko znakov z vrednostjo 'A'. Nato razglasimo celoštevilčni kazalnik in uporabimo statični ukaz za pretvorbo znaka v celoštevilski kazalec.
Ko prevedemo ta program, dobimo naslednji rezultat.
V funkciji ‘int main ()’:
10:35: napaka: neveljaven static_cast od tipa 'char *' do tipa 'int *'
Program izvede napako pri izvedenem statičnem predvajanju, ker ni veljaven. Tako statična oddaja omogoča le veljavno vlivanje ali pretvorbo vrst in povzroči napako, ko poskušamo izvesti neko nezaželeno predvajanje tipov.
# 2) Dinamična igralska zasedba
Dinamična igralska zasedba je izvajalna zasedba, ki se izvaja za preverjanje veljavnosti zasedbe. Dinamična igralska zasedba se izvaja samo na kazalcih razredov in referencah. Izraz vrne NULL vrednost, če oddaja ne uspe.
Dinamična igralska zasedba uporablja mehanizem, znan kot RTTI (Runtime Type Identification) . RTTI omogoča, da so vse informacije o tipu podatkov predmeta na voljo med izvajanjem in so na voljo samo za razrede, ki imajo vsaj eno navidezno funkcijo (polimorfni tip). RTTI omogoča določanje vrste predmeta med izvajanjem ali med izvajanjem.
Poskusimo z enim primerom, da bi razumeli dinamično igralsko zasedbo.
#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'; }V tem programu smo opredelili dva razreda, base z navidezno funkcijo in izpeljan z osnovnim razredom, base.
V glavni funkciji ustvarimo izpeljani objekt razreda, na katerega kaže kazalec osnovnega razreda. Nato izvedemo dynamic_cast na osnovnem kazalcu, ki kaže na izpeljani razred, da ga predvajamo na izpeljani kazalec razreda.
Tako kot v osnovnem razredu je osnova polimorfna (vsebuje navidezno funkcijo), Dynamiccast je uspešen.
Opomba: Če odstranimo navidezno funkcijo iz zgornjega razreda, potem Dynam_cast ne bo uspel, saj informacije RTTI za predmete ne bodo na voljo.
Dinamična igralska zasedba ima v glavnem večjo varnost glede tipa med izvajanjem.
kaj je testiranje dima in zdravega zdravja
# 3) Vnovična interpretacija Cast
Ta vrsta zasedbe je najnevarnejša za uporabo, saj deluje na vseh vrstah predmetov, ne da bi bili razredi med seboj povezani.
Reintepret_cast deluje na katere koli kazalce in pretvori kazalec katere koli vrste v katero koli drugo vrsto, ne glede na to, ali so kazalci med seboj povezani ali ne. Ne preveri, ali je kazalec ali podatki, na katere kaže kazalec, enaki ali ne.
Operator oddaje sprejme samo en parameter, izvorni kazalec, v katerega se pretvori, in ne vrne nobene vrednosti. Preprosto pretvori tip kazalca.
Ne smemo uporabljati, razen če je potrebno. Izvorni kazalec običajno tipkamo na prvotni tip.
Uporabljamo večinoma za delo z bitami. Ko se uporablja za logične vrednosti, se logične vrednosti pretvorijo v celoštevilčne vrednosti, tj. 1 za true in 0 za false.
Oglejmo si primer ponovne interpretacije zasedbe:
#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; } Izhod:
0x3ef3090
do
97
do
V zgornjem primeru smo razglasili celoštevilčni kazalec ptr, ki kaže na vrednost 97. Nato razglasimo kazalec znakov ch in nanj dodamo ptr.
Nato natisnemo različne vrednosti. Najprej natisnemo ptr, ki kaže na celoštevilčno lokacijo. Zato natisne naslov.
Naslednja vrednost ch vsebuje vrednost 97 in tako izpiše 'a', kar je ASCII ekvivalent 97. Naslednja vrednost '* ptr' vsebuje vrednost 97, medtem ko ima '* ch' ASCII ekvivalent 97, tj. reinterpret_cast.
# 4) Const Cast
Operator oddajanja se uporablja za spreminjanje ali manipulacijo trdnosti izvornega kazalca. Z manipulacijo mislimo, da je lahko nastavitev constness nastavljena na non-const kazalec ali pa constness odstranimo iz const kazalca.
Pogoj za uspešno predvajanje operaterja je, da morata biti kazalec in vir, ki ga oddajata, enakega tipa.
Vzemimo primer, da to razumemo.
#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; }V tem primeru vidimo, da funkcija 'printVal' sprejema kazalec, ki ni const. V glavni funkciji imamo const spremenljivko ‘value’ dodeljeno kazalcu const ptr.
Da bi ta kazalnik const posredovali funkciji printVal, smo ga oddali z aplikacijo, da odstranimo constness. Nato prenesemo kazalec ptr_cast v funkcijo, da dobimo želene rezultate.
Zaključek
S tem bomo to temo pretvorbe tipa zaključili v jeziku C ++. Videli smo vse o implicitnih in eksplicitnih pretvorbah, ki se uporabljajo v jeziku C ++.
Vendar se je treba zavedati, da je treba za preprečevanje izgube podatkov in drugih takšnih težav pretvorbe ali tipografsko predvajanje pametno uporabljati le, če razmere zahtevajo uporabo.
=> Tukaj bodite pozorni na vodnik za usposabljanje za začetnike C ++.
Priporočeno branje
- Najboljša BREZPLAČNA vadnica za C #: Ultimate C # Guide za začetnike
- Vnesite kvalifikacije in razrede shranjevanja v C ++
- Vrste preskušanja selitev: s preskusnimi scenariji za vsako vrsto
- Kako se odločiti, katera vrsta testiranja je potrebna za projekt? - Ročno ali avtomatizacija
- Vrste podatkov C ++
- Testiranje obremenitve z vadnicami HP LoadRunner
- Spremenljivke v C ++
- Predloge v jeziku C ++ z primeri