Verwendung von den static_cast-Befehl in C++
-
Verwendung von
static_cast
zum expliziten Konvertieren von Objekttypen in C++ -
Verwenden Sie
reinterpret_cast
, um Objekttypen in C++ explizit zu konvertieren
Dieser Artikel zeigt mehrere Methoden zur Verwendung von static_cast
in C++.
Verwendung von static_cast
zum expliziten Konvertieren von Objekttypen in C++
Eine Operation, die ein Objekt in einen anderen Typ umwandelt, wird casting
genannt. Es gibt Fälle, in denen implizite Konvertierungen in C++ gemäß den Sprachregeln auftreten, z. B. Array-to-Pointer-Zerfall. Casting ist jedoch hauptsächlich mit der expliziten Conversion-Anfrage des Benutzers verbunden. Wenn wir einen Wert des Objekts oder des Ausdrucks in einen anderen Typ umwandeln, zwingen wir den Compiler, den angegebenen Typ dem Zeiger zuzuordnen, der auf das Objekt zeigt.
Es gibt vier benannte explizite Cast-Operationen: const_cast
, static_cast
, reinterpret_cast
und dynamic_cast
. Diese Operationen sind in der modernen C++-Sprache nativ und relativ lesbar als die alten Umwandlungen im C-Stil. Die Casts sind oft gefährlich, und selbst erfahrene Programmierer machen damit Fehler, aber Sie sollten sich nicht entmutigen lassen, diese Konvertierungsoperationen bei Bedarf zu verwenden. In diesem Artikel betrachten wir nur die Operationen static_cast
und reinterpret_cast
.
Die Funktion static_cast
wird im Allgemeinen verwendet, um verwandte Typen als Zeiger derselben Klassenhierarchie oder numerische Typen ineinander umzuwandeln. Dieser Befehl verarbeitet auch Konvertierungen, die von Konstruktoren und Konvertierungsoperatoren definiert werden. Beachten Sie, dass die zweite Zeile in der Funktion main
im Wesentlichen die implizite Umwandlung vom vorzeichenbehafteten char
in eine vorzeichenbehaftete Ganzzahl durchführt, die nur ein wenig von der verdeckten Version der nächsten Zeile ist.
Dies ist die empfohlene Methode, um das Casting in aktuellem C++ durchzuführen, auch wenn das Ergebnis dasselbe ist. Andererseits sind die vierte und fünfte Zeile der Funktion main
keine gültigen Konvertierungen mit der Operation static_cast
. Allerdings können wir die letztgenannte Konvertierung erzwingen, indem wir die Umwandlung im C-Stil verwenden, (int*)x
, die den Ganzzahlwert 97
in hexadezimaler Form und Speicheradressen-Notation ausgibt. Beachten Sie, dass dieser Vorgang höchstwahrscheinlich eine Compiler-Warnung generiert.
#include <iostream>
using std::cout;
using std::endl;
int main() {
char x = 'a';
int x_i = x;
int x_ii = static_cast<int>(x);
int* x_iii = static_cast<int*>(x); // ERROR
int* x_iii = static_cast<int*>(&x); // ERROR
int* x_iii = (int*)x; // WARNING
cout << x << endl;
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
Ausgabe:
a
97
97
0x61
0x7ffeb7c31997
Verwenden Sie reinterpret_cast
, um Objekttypen in C++ explizit zu konvertieren
Alternativ kann die letztere Umwandlung im C-Stil mit der Operation reinterpret_cast
durchgeführt werden, die im folgenden Codebeispiel gezeigt wird. Diese Methode wird die Compilerwarnung stummschalten und der Benutzer kann die Verantwortung für die Konvertierung übernehmen. Wir können verschiedene Zeigertypen mit dem reinterpret_cast
wie char*
in int*
umwandeln.
In diesem Fall entspricht die gedruckte Adresse der Adresse, in der das Zeichen x
gespeichert ist. Denken Sie daran, dass wir, wenn wir den Zeiger x_iii
dereferenzieren, um auf den Wert zuzugreifen, nicht das Zeichen a
oder seine ASCII-Alternative erhalten, sondern eher eine seltsame ganze Zahl. Diese ganze Zahl wird von derselben Position abgerufen. Lediglich die Größe des Datentyps ist unterschiedlich, da er als int
interpretiert wird.
#include <iostream>
using std::cout;
using std::endl;
int main() {
char x = 'a';
int* x_i = (int*)x; // WARNING
int* x_ii = reinterpret_cast<int*>(x);
int* x_iii = reinterpret_cast<int*>(&x);
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
Ausgabe:
0x61
0x61
0x7ffca18be95f
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook