In traditionele C kun je het volgende doen:
int i = 48;
char c = (char)i;
//Now c holds the value of 48.
//(Of course if i > 255 then c will not hold the same value as i).
Welke van de c++-castingmethoden (static_cast, reinterpret_cast) is geschikt om deze klus te klaren?
Antwoord 1, autoriteit 100%
Je kunt impliciet converteren tussen numerieke typen, zelfs als dat aan precisie inboet:
char c = i;
Het is echter mogelijk dat u compilerwaarschuwingen wilt inschakelen om mogelijk verliesgevende conversies zoals deze te voorkomen. Als je dat doet, gebruik dan static_cast
voor de conversie.
Van de andere cast:
dynamic_cast
werkt alleen voor verwijzingen of verwijzingen naar polymorfe klassentypen;const_cast
kan geen typen wijzigen, alleenconst
ofvolatile
kwalificaties;reinterpret_cast
is voor speciale omstandigheden, converteren tussen verwijzingen of verwijzingen en volledig ongerelateerde typen. Het zal met name geen numerieke conversies uitvoeren.- C-stijl en functie-stijl casts doen elke combinatie van
static_cast
,const_cast
enreinterpret_cast
die nodig is om de klus te klaren.
Antwoord 2, autoriteit 97%
U moet static_cast<char>(i)
gebruiken om het gehele getal i
naar char
te casten.
reinterpret_cast
zou bijna nooit moeten worden gebruikt, tenzij je een type wilt casten in een fundamenteel ander type.
Ook reinterpret_cast
is machine-afhankelijk, dus veilig gebruikt het vereist het volledige begrip van de typen en hoe de compiler de cast implementeert.
Voor meer informatie over C++ Casting Zie:
- Wanneer moet Static_cast, Dynamic_cast, Const_cast en herinterpret_cast worden gebruikt?
- http://www.cplusplus.com/doc/tutorial/typecasting/.
Antwoord 3
reinterpret_cast
kan niet worden gebruikt voor deze conversie, de code zal niet compileren. Volgens C++ 03 standaard sectie 5.2.10-1:
Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.
Deze conversie staat niet in die sectie vermeld. Zelfs dit is ongeldig:
long l = reinterpret_cast<long>(i)
static_cast
is degene die hier moet worden gebruikt. Zie dit en deze dus vragen.
Antwoord 4
Het gebruik van statische cast zou waarschijnlijk resulteren in zoiets:
// This does not prevent a possible type overflow
const char char_max = -1;
int i = 48;
char c = (i & char_max);
Om het mogelijke overloop van het type te voorkomen, zou u dit kunnen doen:
const char char_max = (char)(((unsigned char) char(-1)) / 2);
int i = 128;
char c = (i & char_max); // Would always result in positive signed values.
Waar reinterpret_cast waarschijnlijk gewoon direct zou worden omgezet in char, zonder enige cast-veiligheid.
-> Gebruik nooit reinterpret_cast als je ook static_cast kunt gebruiken.
Als je tussen klassen cast, zorgt static_cast er ook voor dat de twee typen overeenkomen (het object is een afgeleide van het cast-type).
Als uw object een polymorf type is en u niet weet welk type het is, moet u dynamic_cast gebruiken, die tijdens runtime een typecontrole uitvoert en nullptr retourneert als de typen niet overeenkomen.
ALS je const_cast nodig hebt, heb je waarschijnlijk iets verkeerd gedaan en moet je nadenken over mogelijke alternatieven om de const-correctheid in je code op te lossen.