type conversions c
Tjek de forskellige type konverteringer, der understøttes i C ++.
Vi håber, at du skal være opmærksom på alle datatyper, der er tilgængelige i C ++ fra vores tidligere tutorials. Til tider kan der opstå et behov, så vi har brug for at konvertere en type til en anden. Dette kaldes type konvertering eller type-casting.
I denne vejledning diskuterer vi de forskellige typer konverteringer, der understøttes i C ++.
hvordan man opretter en ny liste i java
=> Klik her for det gratis C ++ kursus.
Hvad du lærer:
- Skriv konverteringer
- Implicit konvertering
- Eksplicit konvertering
- Typer af støbning
- Konklusion
- Anbefalet læsning
Skriv konverteringer
C ++ understøtter to typer typekonverteringer:
- Implicit type konvertering: Implicit type konvertering er automatisk. Der er ingen indblanding fra brugeren i denne type konvertering, og compileren udfører direkte konverteringen. Konvertering sker normalt, når der i udtryk er mere end en type data. Men generelt er der i denne type konvertering en mulighed for tab af data, tab af tegn eller overløb af data.
- Eksplicit type konvertering: Eksplicit type konvertering er brugerdefineret og kaldes normalt “type-casting”. Her caster eller konverterer brugeren en værdi af en datatype til en anden afhængigt af kravene. Denne type konverteringer er sikrere.
Nu vil vi se begge typer type konvertering i detaljer.
Implicit konvertering
I implicit konvertering udfører compileren konverteringerne fra en datatype til en anden, når et udtryk har mere end en datatype. For at forhindre tab af data konverteres alle variablerne for de andre datatyper til den største datatype. Dette kaldes forfremmelse.
Lad os forstå Implicit konvertering ved hjælp af et kodeeksempel.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Produktion:
10 + 'A' = 75
float val (10 + ‘a’) = 107
var_int = 1000
Ovenstående kodeeksempel demonstrerer implicit konvertering. Vi har erklæret et heltal og en tegnvariabel med henholdsvis værdierne 10 og 'A'. Når vi sammenlægger disse to variabler, finder en implicit konvertering sted.
Da heltal er den større type i dette udtryk, konverteres tegnvariabelværdien 'A' til dens heltalækvivalent, dvs. værdi 65 (ASCII-værdi). Resultatet af udtrykket er således 75.
I det næste udtryk tilføjer vi heltal og tegn (‘a’ -> 97) og tildeler derefter resultatet til at flyde. Således konverteres resultatet af udtrykket implicit til at flyde af kompilatoren.
I det tredje udtryk konverteres en kort int-variabel implicit til heltal.
Bemærk : I tilfælde af implicitte konverteringer, hvis compileren registrerer et potentielt tab af data, kan den muligvis blinke en advarsel herom.
Eksplicit konvertering
Eksplicit konvertering kaldes også 'type-casting', da vi 'caster' en datatype til en anden datatype. Her definerer brugerne eksplicit castingen, i modsætning til implicit konvertering, hvor compileren internt udfører konverteringen.
Vi kan udføre eksplicit konvertering på to måder:
# 1) Brug af tildelingsoperatør
Eksplicit konvertering eller typecasting ved hjælp af tildelingsoperatøren på en måde udføres kraftigt. Her caster eller konverterer vi en datatype til en anden datatype ved hjælp af tildelingsoperatøren.
Den generelle syntaks er:
hvad udløser port vs videresendelse af havn
(data type) expression;
Følgende eksempel forklarer dette:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Produktion:
Sum = 5563
Comp = 5563,2
Vi har vist eksplicit casting ved hjælp af tildelingsoperatøren i ovenstående eksempel. For det første kaster vi den variable løn af typen dobbelt til en heltalstype. Derefter kaster vi heltalets variable sum til en dobbelt type.
Som vist i output angiver den type, som vi caster til, den endelige type af resultatet af udtrykket.
Dette er fordelagtigt, da brugeren kan ændre typen af udtryk i henhold til kravene.
# 2) Brug af Cast Operator
I denne type støbning bruger vi en 'cast operator', der er en unary operator til at skifte fra en type til en anden.
Typer af støbning
Vi har følgende typer støbning afhængigt af den støbteoperatør, vi bruger:
# 1) Statisk rollebesætning
Den statiske rollebesætning er den enkleste blandt alle typecasting ved hjælp af cast-operatøren . Den statiske rollebesætning er i stand til at udføre alle de konverteringer, der udføres implicit. Det udfører også konverteringer mellem pointere i klasser relateret til hinanden (upcast -> fra afledt til base eller downcast -> fra base til afledt).
Bortset fra de ovennævnte konverteringer er den statiske rollebesætning også i stand til at konvertere enhver markør til ugyldig *.
Den statiske rollebesætning er den samlede tidsbesætning. Dette betyder, at der ikke er foretaget nogen kontrol ved kørsel for at se, om den udførte rollebesætning er gyldig eller ej. Derfor forbliver det programmørens ansvar at sikre, at konverteringen var sikker og gyldig.
Med andre ord skal brugeren sikre, at det konverterede objekt var fuldt i forhold til destinationsdatatypen.
Vi specificerer en statisk rollebesætning som følger:
static_cast (expression)
Lad os forstå statisk rollebesætning ved hjælp af et eksempel.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<I ovenstående eksempel har vi let ændret koden til at inkludere en tegnvariabel med værdien 'A'. Derefter erklærer vi et heltalsmarkør og anvender en statisk rollebesætning for at konvertere et tegn til et heltalsmarkør.
Når vi sammensætter dette program, får vi følgende output.
I funktion 'int main ()':
10:35: fejl: ugyldig static_cast fra type 'char *' til type 'int *'
Programmet giver en fejl for den statiske rollebesætning, der udføres, da den er ugyldig. Således tillader statisk cast kun gyldig type casting eller konverteringer og giver en fejl, når vi forsøger at udføre nogle uønskede typecasting.
# 2) Dynamisk rollebesætning
Dynamisk rollebesætning er en runtime-rollebesætning, der udføres for at kontrollere gyldigheden af rollebesætningen. Dynamisk rollebesætning udføres kun på klassemarkører og referencer. Udtrykket returnerer en NULL-værdi, hvis rollebesætningen mislykkes.
Den dynamiske rollebesætning bruger en mekanisme kendt som RTTI (Runtime Type Identification) . RTTI gør al information om objektets datatype tilgængelig under kørsel og er kun tilgængelig for de klasser, der har mindst en virtuel funktion (polymorf type). RTTI tillader bestemmelse af objekttypen ved kørsel eller på tidspunktet for udførelse.
Lad os prøve et eksempel for at forstå dynamisk rollebesætning.
#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'; }
I dette program har vi defineret to klasser, base med en virtuel funktion og afledt med en baseklasse, base.
I hovedfunktionen opretter vi et afledt klasseobjekt, som baseklassemarkøren peger på. Derefter udfører vi dynamic_cast på basismarkøren, der peger på en afledt klasse for at kaste den til en afledt klassemarkør.
Som i baseklassen er basen polymorf (indeholder virtuel funktion), den dynamiske udsendelse er vellykket.
Bemærk: Hvis vi fjerner den virtuelle funktion fra ovenstående klasse, mislykkes dynamic_cast, da RTTI-information for objekterne ikke vil være tilgængelige.
Den dynamiske rollebesætning har en overhead af typesikkerhed ved kørsel.
pc-reparations- og optimeringsværktøj Windows 10
# 3) Genfortolke rollebesætningen
Denne type rollebesætninger er mest farlig at bruge, da den fungerer på enhver form for genstand uden at klasserne er relateret til hinanden.
Reintepret_cast fungerer på alle markører, og det konverterer en markør af enhver type til enhver anden type, uanset om markørerne er relateret til hinanden eller ej. Det kontrollerer ikke, om markøren eller de data, markøren peger på, er ens eller ikke.
Cast-operatøren tager kun en parameter, kildemarkøren, der skal konverteres til, og returnerer ikke nogen værdi. Det konverterer simpelthen markørtypen.
Vi bør ikke bruge, medmindre det kræves. Vi indtaster normalt kildemarkøren til den oprindelige type.
Vi bruger mest til at arbejde med bits. Når det bruges på boolske værdier, konverteres boolske værdier til heltal, dvs. 1 for sand og 0 for falsk.
Lad os se et eksempel på genfortolke rollebesætningen:
#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; }
Produktion:
0x3ef3090
til
97
til
I ovenstående eksempel har vi erklæret et heltalspeger ptr, der peger på værdi 97. Dernæst erklærer vi en tegnpeger ch og kaster ptr til det ved hjælp af.
Dernæst udskriver vi forskellige værdier. Den første, vi udskriver, er ptr, der peger på et heltal. Derfor udskrives en adresse.
Den næste værdi ch indeholder værdi 97, og den udskriver således 'a', der svarer til ASCII-ækvivalent til 97. Den næste værdi '* ptr' holder værdien 97, mens '* ch' holder ASCII-ækvivalent med 97, dvs. 'a', når den kastes ved hjælp af genfortolkningen_cast.
# 4) Const Cast
Cast-operatøren bruges til at ændre eller manipulere konstruktionen af kildemarkøren. Ved manipulation mener vi, at det enten kan være at indstille konstruktion til en ikke-const-markør eller fjerne constness fra en const-markør.
Betingelsen for at kunne caste operatøren er, at markøren og kilden, der er støbt, skal være af samme type.
Lad os tage et eksempel for at forstå dette.
#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; }
I dette eksempel ser vi, at funktionen 'printVal' accepterer en ikke-const-markør. I hovedfunktionen har vi en const-variabel 'værdi' tildelt const-markøren ptr.
For at overføre denne const-markør til funktionen printVal, kaster vi den ved at anvende for at fjerne konstensen. Derefter sender vi markøren ptr_cast til funktionen for at få de ønskede resultater.
Konklusion
Med dette vil vi afslutte dette emne om typekonvertering i C ++. Vi har set alt om implicitte og eksplicitte konverteringer, der bruges i C ++.
Man skal dog være opmærksom på, at for at forhindre tab af data og andre sådanne vanskeligheder, skal konverteringer eller typecasting kun anvendes klogt, hvis situationen nødvendiggør brugen.
=> Hold øje med begyndere C ++ træningsvejledning her.
Anbefalet læsning
- Bedste GRATIS C # tutorialsserie: Den ultimative C # guide til begyndere
- Skriv kvalifikatorer og opbevaringsklasser i C ++
- Typer af migreringstest: Med testscenarier for hver type
- Hvordan beslutter jeg, hvilken type test der kræves for et projekt? - Manuel eller automatisering
- C ++ datatyper
- Load Testing med HP LoadRunner-vejledninger
- Variabler i C ++
- Skabeloner i C ++ med eksempler