type conversions c
Bekijk de verschillende typeconversies die worden ondersteund in C ++.
We hopen dat je op de hoogte bent van alle gegevenstypen die beschikbaar zijn in C ++ uit onze eerdere tutorials. Soms kan het zo zijn dat we het ene type naar het andere moeten converteren. Dit wordt typeconversie of typecasting genoemd.
In deze tutorial bespreken we de verschillende typeconversies die worden ondersteund in C ++.
hoe voer ik een jar-bestand uit
Klik hier voor de gratis C ++ cursus.
Wat je leert:
- Typ conversies
- Impliciete conversie
- Expliciete conversie
- Soorten gieten
- Gevolgtrekking
- Aanbevolen literatuur
Typ conversies
C ++ ondersteunt twee soorten typeconversies:
- Impliciete typeconversie: Impliciete typeconversie is automatisch. Er is geen tussenkomst van de gebruiker bij dit type conversie en de compiler voert de conversie direct uit. Conversie wordt meestal gedaan als er in expressie meer dan één type gegevens is. Maar over het algemeen is er bij dit type conversie een mogelijkheid voor verlies van gegevens, verlies van tekens of een overloop van gegevens.
- Expliciete typeconversie: Expliciete typeconversie is door de gebruiker gedefinieerd en wordt normaal gesproken 'type-casting' genoemd. Hier cast of converteert de gebruiker een waarde van het ene gegevenstype naar het andere, afhankelijk van de vereisten. Dit soort conversies is veiliger.
Nu zullen we beide typen typeconversie in detail bekijken.
Impliciete conversie
Bij impliciete conversie voert de compiler de conversies uit van het ene gegevenstype naar het andere wanneer een uitdrukking meer dan één gegevenstype heeft. Om gegevensverlies te voorkomen, worden alle variabelen van de andere gegevenstypen geconverteerd naar het grootste gegevenstype. Dit heet promotie.
Laten we impliciete conversie begrijpen met behulp van een codevoorbeeld.
Uitgang:
10 + 'A' = 75
float val (10 + ‘a’) = 107
var_int = 1000
Het bovenstaande codevoorbeeld demonstreert impliciete conversie. We hebben een geheel getal en een tekenvariabele gedeclareerd met respectievelijk de waarden 10 en ‘A’. Als we deze twee variabelen bij elkaar optellen, vindt er een impliciete conversie plaats.
Aangezien integer het grootste type is in deze uitdrukking, wordt de waarde van de tekenvariabele ‘A’ geconverteerd naar het equivalent van een integer, d.w.z. waarde 65 (ASCII-waarde). Het resultaat van de uitdrukking is dus 75.
In de volgende uitdrukking voegen we geheel getal en teken (‘a’ -> 97) toe en wijzen we het resultaat toe aan zwevend. Het resultaat van de expressie wordt dus impliciet geconverteerd naar float door de compiler.
In de derde uitdrukking wordt een korte int-variabele impliciet geconverteerd naar een geheel getal.
Notitie : In het geval van impliciete conversies, als de compiler een potentieel verlies van gegevens detecteert, kan het een waarschuwing hiervan flitsen.
Expliciete conversie
Expliciete conversie wordt ook wel 'type-casting' genoemd, omdat we het ene gegevenstype naar een ander gegevenstype 'casten'. Hier definiëren de gebruikers expliciet de casting, in tegenstelling tot de impliciete conversie waarbij de compiler de conversie intern uitvoert.
We kunnen expliciete conversie op twee manieren uitvoeren:
# 1) Toewijzingsoperator gebruiken
Expliciete conversie of typecasting met behulp van een toewijzingsoperator wordt op een bepaalde manier krachtig uitgevoerd. Hier casten of converteren we het ene gegevenstype naar een ander gegevenstype met behulp van de toewijzingsoperator.
De algemene syntaxis is:
Het volgende voorbeeld legt dit uit:
Uitgang:
Som = 5563
Comp = 5563,2
We hebben expliciet casten getoond met behulp van de toewijzingsoperator in het bovenstaande voorbeeld. Eerst gieten we het variabele salaris van het type dubbel naar een integer-type. Vervolgens casten we de integer variabele som naar een dubbel type.
Zoals in de uitvoer wordt getoond, geeft het type waarnaar we casten het laatste type van het resultaat van de uitdrukking aan.
Dit is voordelig omdat de gebruiker het type uitdrukking kan wijzigen volgens de vereisten.
# 2) Cast Operator gebruiken
Bij dit type casting gebruiken we een 'cast-operator', een unaire operator om van het ene type naar het andere te wisselen.
vermeld alle besturingssystemen waarmee u bekend bent
Soorten gieten
We hebben de volgende soorten casting, afhankelijk van de cast-operator die we gebruiken:
# 1) Statische cast
De statische cast is de eenvoudigste van alle typecasting met de cast-operator De statische cast kan alle conversies uitvoeren die impliciet worden uitgevoerd. Het voert ook conversies uit tussen pointers van klassen die aan elkaar gerelateerd zijn (upcast -> van afgeleid naar basis of downcast -> van basis naar afgeleid).
Afgezien van de hierboven genoemde conversies, kan de statische cast ook elke aanwijzer naar leegte converteren *.
De statische cast is de gecompileerde tijdcast. Dit betekent dat er tijdens runtime geen controle wordt uitgevoerd om te zien of de uitgevoerde cast geldig is of niet. Het blijft dus de verantwoordelijkheid van de programmeur om ervoor te zorgen dat de conversie veilig en geldig was.
Met andere woorden, de gebruiker moet ervoor zorgen dat het geconverteerde object vol was met betrekking tot het gegevenstype van de bestemming.
We specificeren een statische cast als volgt:
Laten we Static Cast begrijpen aan de hand van een voorbeeld.
Uitgang:
Voor het gieten: df = 42.875
Na static_cast: totaal = 42
Dus in het bovenstaande voorbeeld hebben we de waarde van type double berekend. Vervolgens passen we een static_cast toe op deze waarde om deze naar een geheel getal te converteren. In de uitvoer zien we dat de waarde wordt afgekapt nadat we deze naar int hebben gecast.
Laten we nu de bovenstaande code als volgt wijzigen:
In het bovenstaande voorbeeld hebben we de code enigszins aangepast om een tekenvariabele met de waarde ‘A’ op te nemen. Vervolgens declareren we een integer pointer en passen we een statische cast toe om een karakter om te zetten in een integer pointer.
Als we dit programma compileren, krijgen we de volgende output.
In functie ‘int main ()’:
10:35: fout: ongeldige static_cast van type ‘char *’ tot ‘int *’ typen
Het programma geeft een foutmelding voor de uitgevoerde statische cast omdat deze ongeldig is. Statische cast staat dus alleen geldige typecasting of conversies toe en geeft een foutmelding wanneer we proberen een aantal ongewenste typecasting uit te voeren.
# 2) Dynamische cast
Dynamic cast is een runtime cast die wordt uitgevoerd om de geldigheid van de cast te controleren. Dynamische cast wordt alleen uitgevoerd op class pointers en referenties. De expressie retourneert een NULL-waarde als de cast mislukt.
De dynamische cast gebruikt een mechanisme dat bekend staat als RTTI (Runtime Type Identification) RTTI maakt alle informatie over het gegevenstype van het object beschikbaar tijdens runtime en is alleen beschikbaar voor de klassen die ten minste één virtuele functie hebben (polymorf type). Met RTTI kan het objecttype tijdens runtime of op het moment van uitvoering worden bepaald.
Laten we een voorbeeld proberen om Dynamic Cast te begrijpen.
In dit programma hebben we twee klassen gedefinieerd, basis met een virtuele functie en afgeleid met een basisklasse, basis.
In de hoofdfunctie maken we een afgeleid klasseobject waarnaar wordt verwezen door de basisklasse-pointer. Vervolgens voeren we dynamic_cast uit op de basispointer die naar een afgeleide klasse verwijst om deze naar een afgeleide klassenpointer te casten.
Net als bij de basisklasse is de basis polymorf (bevat virtuele functie), de dynamic_cast is succesvol.
Opmerking: Als we de virtuele functie uit de bovenstaande klasse verwijderen, zal dynamic_cast mislukken omdat RTTI-informatie voor de objecten niet beschikbaar zal zijn.
De dynamische cast heeft tijdens runtime een overhead van typeveiligheid.
# 3) Cast opnieuw interpreteren
Dit type cast is het gevaarlijkst om te gebruiken, omdat het op elk type object werkt zonder dat de klassen aan elkaar gerelateerd zijn.
Reintepret_cast werkt op alle pointers en converteert een pointer van elk type naar een ander type, ongeacht of de pointers aan elkaar gerelateerd zijn of niet. Het controleert niet of de aanwijzer of de gegevens waarnaar door de aanwijzer wordt verwezen, hetzelfde zijn of niet.
De cast-operator gebruikt slechts één parameter, de bronpointer waarnaar moet worden geconverteerd, en retourneert geen waarde. Het converteert eenvoudig het aanwijzertype.
We zouden niet moeten gebruiken tenzij vereist. We typeren de bronpointer meestal naar het oorspronkelijke type.
We gebruiken meestal om met bits te werken. Wanneer wordt gebruikt voor Booleaanse waarden, worden Booleaanse waarden geconverteerd naar gehele getallen, d.w.z. 1 voor true en 0 voor false.
Laten we eens kijken naar een voorbeeld van Reinterpret-cast:
Uitgang:
0x3ef3090
naar
97
naar
In het bovenstaande voorbeeld hebben we een integer pointer ptr gedeclareerd die naar waarde 97 wijst. Vervolgens declareren we een karakter pointer ch en cast ptr ernaar met.
Vervolgens drukken we verschillende waarden af. De eerste die we afdrukken is ptr die naar een locatie met een geheel getal verwijst. Daarom drukt het een adres af.
De volgende waarde ch bevat waarde 97 en drukt dus 'a' af, wat ASCII-equivalent is van 97. De volgende waarde '* ptr' bevat de waarde 97 terwijl '* ch' ASCII-equivalent van 97 bevat, dwz 'a' zoals het cast met de reinterpret_cast.
# 4) Const Cast
De cast-operator wordt gebruikt om de constness van de source-pointer te wijzigen of te manipuleren. Met manipulatie bedoelen we dat het ofwel kan zijn om constness in te stellen op een niet-const-pointer of constness te verwijderen uit een const-pointer.
De voorwaarde om de operator met succes te casten, is dat de pointer en de bron die wordt gecast van hetzelfde type moeten zijn.
Laten we een voorbeeld nemen om dit te begrijpen.
In dit voorbeeld zien we dat de functie ‘printVal’ een non-const pointer accepteert. In de hoofdfunctie hebben we een const variabele ‘waarde’ toegewezen aan de const pointer ptr.
Om deze const pointer door te geven aan de functie printVal, casten we deze door toe te passen om de constness te verwijderen. Vervolgens geven we de pointer ptr_cast door aan de functie om de gewenste resultaten te krijgen.
software testen gedragsmatige interviewvragen en antwoorden
Gevolgtrekking
Hiermee zullen we dit onderwerp van typeconversie in C ++ afronden. We hebben alles gezien over impliciete en expliciete conversies die worden gebruikt in C ++.
Men moet zich er echter van bewust zijn dat conversies of typecasting alleen verstandig moeten worden toegepast als de situatie het gebruik noodzakelijk maakt om gegevensverlies en andere dergelijke moeilijkheden te voorkomen.
Bekijk hier de Beginners C ++ Trainingsgids.
Aanbevolen literatuur
- Beste GRATIS C # Tutorial-serie: de ultieme C # -gids voor beginners
- Typ kwalificaties en opslagklassen in C ++
- Typen migratietests: met testscenario's voor elk type
- Hoe te beslissen welk type testen vereist is voor een project? - Handmatig of automatisering
- C ++ gegevenstypen
- Laadtests met HP LoadRunner-zelfstudies
- Variabelen in C ++
- Sjablonen in C ++ met voorbeelden