Verwendung von den static_cast-Befehl in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung von static_cast zum expliziten Konvertieren von Objekttypen in C++
  2. Verwenden Sie reinterpret_cast, um Objekttypen in C++ explizit zu konvertieren
Verwendung von den static_cast-Befehl in C++

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ Cast