C++-Typkonvertierung
In der C-Sprache erfordert die Typkonvertierung lediglich das Hinzufügen des Variablentyps vor der Variablen , und die Konvertierung kann bidirektional erfolgen. Beispielsweise kann der Typ int in den Typ double konvertiert werden, und der Typ double kann auch in den Typ int konvertiert werden. (Empfohlenes Tutorial: C++-Handbuch-Tutorial)
Aber diese einfache und grobe Methode ist in C++ ungeeignet. Erstens kann die benutzerdefinierte Datentypklasse in C++ nicht vervollständigt werden; zweitens kann die C-Sprache zwischen beliebigen Typen konvertieren. Dies ist beispielsweise sehr nützlich Für C++, das über eine sehr strenge Typprüfung verfügt, ist dies offensichtlich unzumutbar. Daher bietet C++ vier eindeutige Typkonvertierungsoperatoren.
1. static_cast
ähnelt der Typkonvertierung in der C-Sprache und kann eine bedingungslose Typkonvertierung durchführen. Anwendungsszenarien:
Grundlegende Typkonvertierung.
int i = 1; double j = static_cast <double> (i);
Konvertierung zwischen übergeordneten Klassen- und Unterklassenzeigern. Wenn der Zeiger der übergeordneten Klasse auf ein Objekt zeigt, ist es unsicher, den Zeiger der übergeordneten Klasse in einen Zeiger der Unterklasse umzuwandeln. Es ist jedoch sicher, den Zeiger der Unterklasse in einen Zeiger der übergeordneten Klasse umzuwandeln.
class Base( ) { }; class Derived : public Base { }; Base * p1 = new Base; Derived * p2 = new Derived; Derived * p3 = static_cast <Derived *> (p1); // 不安全 Base * p4 = static_cast <Base *> (p2); // 安全
Konvertiert jede Art von Ausdruck in den Typ „void“.
Hinweis: static_cast kann die const- oder volatile-Attribute eines Typs nicht entfernen; es können keine unabhängigen Typkonvertierungen (z. B. Nicht-Basisklassen und Unterklassen) durchgeführt werden.
2. Dynamic_cast
Dynamic_cast kann nur zum Konvertieren zwischen Objektzeigern verwendet werden, und das Konvertierungsergebnis kann auch angewendet werden. Bei der Upstream-Konvertierung zwischen Klassenebenen sind die Auswirkungen von „dynamic_cast“ und „static_cast“ gleich; bei der Downstream-Konvertierung verfügt „dynamic_cast“ über eine Typprüfungsfunktion und ist sicherer als „static_cast“.
class Base { virtual void dummy ( ) { } }; class Derived : public Base { }; Base * b1 = new Base; Base * b2 = new Derived; Derived * b3 = dynamic_cast <Derived * > (b1); // 转换失败,返回 NULL Derived * b4 = dynamic_cast <Derived * > (b2); // 转换成功 Derived & b5 = dynamic_cast <Derived & > (b1); // 转换失败(抛出异常) Derived & b6 = dynamic_cast <Derived & > (b2); // 转换成功
Hinweis: Beim Konvertieren von Zeigern zwischen übergeordneten und untergeordneten Klassen muss die übergeordnete Klasse eine virtuelle Funktion enthalten.
3. const_cast
wird verwendet, um das const-Attribut zu entfernen, das const- oder volatile-Attribut des Typs zu entfernen und den const-Typzeiger in einen Nicht-Typzeiger zu ändern. const-Typ-Zeiger.
const int * fun(int x, int y) { }; int * ptr = const_cast < int * > (fun(2, 3));
4. reinterpret_cast
reinterpret_cast interpretiert nur den Typ neu, ohne binäre Konvertierung. Anwendung:
Der konvertierte Typ muss ein Zeiger, eine Referenz, ein arithmetischer Typ, ein Funktionszeiger oder ein Mitgliedszeiger sein. Die Konvertierung erfolgt auf Bitebene. Es kann einen Zeiger in eine Ganzzahl oder eine Ganzzahl in einen Zeiger umwandeln (zuerst einen Zeiger in eine Ganzzahl umwandeln und dann die Ganzzahl in einen Zeiger des ursprünglichen Typs umwandeln, und Sie können auch den ursprünglichen Zeigerwert erhalten). Nicht-32-Bit-Instanzen können jedoch nicht in Zeiger umgewandelt werden.
wird im Allgemeinen zum Konvertieren zwischen Funktionszeigertypen verwendet.
Die Portabilität kann nicht garantiert werden.
Hinweis: Diese Typkonvertierung ist unsicher und sollte mit Vorsicht verwendet werden.
Das obige ist der detaillierte Inhalt vonC++-Typkonvertierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!