Heim  >  Artikel  >  Backend-Entwicklung  >  C++-Typkonvertierung

C++-Typkonvertierung

angryTom
angryTomOriginal
2019-10-26 11:02:085632Durchsuche

C++-Typkonvertierung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:C++-GrundkenntnisseNächster Artikel:C++-Grundkenntnisse