Heim  >  Artikel  >  Backend-Entwicklung  >  Vier Arten von Umwandlungen in C++_Basic-Verwendung und Verwendungsszenarien

Vier Arten von Umwandlungen in C++_Basic-Verwendung und Verwendungsszenarien

php是最好的语言
php是最好的语言Original
2018-08-01 14:20:393570Durchsuche

Typkonvertierung in C:

Die Dinge müssen von vorne beginnen, das ist die C-Sprache. Wir sind es gewohnt, C-ähnliche Typkonvertierungen zu verwenden, weil es so ist kraftvoll und einfach.

hat hauptsächlich die folgenden zwei Formen:

  • (neuer Typ) Ausdruck

  • neuer Typ (Ausdruck)

Das Konvertierungsformat im C-Stil ist sehr einfach, weist jedoch viele Mängel auf:

 1. Die Konvertierung ist zu zufällig und kann zwischen allen konvertiert werden Typen. Sie können einen Zeiger auf ein konstantes Objekt in einen Zeiger auf ein nicht konstantes Objekt umwandeln und einen Zeiger auf ein Basisklassenobjekt in einen Zeiger auf ein abgeleitetes Klassenobjekt konvertieren. Die Lücke zwischen diesen Konvertierungen ist sehr groß, aber die traditionelle C-Sprache -Stilabgüsse machen keinen Unterschied zwischen diesen.

2. Es gibt keine einheitlichen Schlüsselwörter und Bezeichner für die Konvertierung im C-Stil. Bei großen Systemen kann es bei der Code-Fehlerbehebung leicht übersehen und ignoriert werden.

Typkonvertierung in C++:

Der C++-Stil löst die beiden oben genannten Probleme perfekt. 1. Die Typkonvertierung ist unterteilt und es werden vier verschiedene Konvertierungstypen bereitgestellt, um Konvertierungen mit unterschiedlichen Anforderungen zu unterstützen. 2. Die Typkonvertierung verfügt über eine einheitliche Kennung, die für die Fehlerbehebung und Überprüfung des Codes praktisch ist. Im Folgenden werden die vier Konvertierungen vorgestellt: static_cast, dynamische_cast, const_cast und reinterpreter_cast.

  • static_cast, die Benennung wird als statische Typkonvertierung verstanden. Zum Beispiel die Konvertierung von int in char.

  • dynamic_cast, die Benennung versteht sich als dynamische Typkonvertierung. Zum Beispiel die polymorphe Typkonvertierung zwischen Unterklasse und übergeordneter Klasse.

  • const_cast bedeutet wörtlich, das const-Attribut zu entfernen.

  • reinterpreter_cast, interpretiert nur den Typ neu, führt jedoch keine Binärkonvertierung durch.

1. static_cast-Konvertierung

 1.Grundlegende Verwendung: static_cast-Ausdruck

 2.Verwendungsszenarien :

a. Wird zur Konvertierung von Zeigern oder Referenzen zwischen Basisklassen und abgeleiteten Klassen in der Klassenhierarchie verwendet

Aufwärtskonvertierung (abgeleitete Klasse –> Basisklasse) ist sicher;

Downcast (Basisklasse -> abgeleitete Klasse) ist unsicher, da keine dynamische Typprüfung erfolgt.

b. Wird für die Konvertierung zwischen grundlegenden Datentypen verwendet, z. B. die Konvertierung von int in char. Dies bringt Sicherheitsprobleme mit sich und muss vom Programmierer sichergestellt werden.

c Zieltyp

d. Konvertieren Sie einen beliebigen Ausdruckstyp in einen ungültigen Typ

3. Verwendungsfunktionen

Führen Sie hauptsächlich nicht-polymorphe Konvertierungsoperationen durch Wird verwendet, um die üblichen Konvertierungsoperationen in C zu ersetzen

b. Es wird empfohlen, static_cast für implizite Konvertierungen zu verwenden, um

int n = 6;double d = static_cast<double>(n); // 基本类型转换int *pn = &n;double *d = static_cast<double *>(&n) //无关类型指针转换,编译错误void *p = static_cast<void *>(pn); //任意类型转换成void类型

2. Dynamic_cast-Konvertierung

anzuzeigen und zu ersetzen

 1.Grundlegende Verwendung: Dynamic_cast-Ausdruck

 2.Verwendungsszenarien: Verwenden Sie Dynamic_cast nur beim Konvertieren zwischen abgeleiteten Klassen. Typ -id muss ein Klassenzeiger sein , Klassenreferenz oder void*.

 3.Nutzungsfunktionen:

 a Die Basisklasse muss eine virtuelle Funktion haben, da Dynamic_cast eine Laufzeittypprüfung ist und Laufzeittypinformationen sowie diese Informationen erfordert Es wird in der virtuellen Funktionstabelle der Klasse gespeichert. Nur eine Klasse, die eine virtuelle Funktion definiert, verfügt über eine virtuelle Funktionstabelle (wenn eine Klasse im Allgemeinen keine virtuelle Funktion hat, möchte der Designer dieser Klasse nicht). es soll eine Basisklasse werden).

b. Bei der Abwärtskonvertierung ist „dynamic_cast“ sicher (wenn die Typen inkonsistent sind, ist der konvertierte Zeiger ein Nullzeiger), während „static_cast“ unsicher ist (wenn die Typen inkonsistent sind, ist der konvertierte Zeiger ein Zeiger mit dem falsche Bedeutung), kann verschiedene Probleme wie Speicher-Trampling und illegalen Zugriff verursachen

1.

Grundlegende Verwendung

: const_castexpression

 2.Verwendungsszenarien

:

 a Zeiger und zeigt weiterhin auf das ursprüngliche Objekt

b. Die konstante Referenz wird in eine nicht konstante Referenz umgewandelt und zeigt weiterhin auf das ursprüngliche Objekt

3. Funktionen verwenden

:

a. cosnt_cast Es ist der einzige Konvertierungsoperator unter den vier Typkonvertierungsoperatoren, der mit Konstanten arbeiten kann.

Das Entfernen von Konstanten ist eine gefährliche Aktion. Vermeiden Sie daher die Verwendung. Ein spezifisches Szenario ist: Wenn eine Klasse eine Überladung durch const bereitstellt, ruft die nicht konstante Funktion normalerweise const_cast auf, um die Parameter in Konstanten umzuwandeln, ruft dann die konstante Funktion auf, ruft dann das Ergebnis ab und ruft dann const_cast auf, um die Konstanz zu entfernen.

class BaseClass 
{public:
  int m_iNum;
  virtual void foo(){};//基类必须有虚函数。保持多台特性才能使用dynamic_cast};class DerivedClass: public BaseClass 
{public:
  char *m_szName[100];
  void bar(){};
};
  
BaseClass* pb = new DerivedClass();
DerivedClass *pd1 = static_cast<DerivedClass *>(pb);//子类->父类,静态类型转换,正确但不推荐DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb);//子类->父类,动态类型转换,正确BaseClass* pb2 = new BaseClass();//父类->子类,静态类型转换,危险!访问子类m_szName成员越界DerivedClass *pd21 = static_cast<DerivedClass *>(pb2);//父类->子类,动态类型转换,安全的。结果是NULLDerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2);
4. reinterpret_cast-Konvertierung

 1.

Grundlegende Verwendung

: reinterpret_castexpression

2.Nutzungsszenarien

: Verwenden Sie dieses Konvertierungszeichen nicht als letzten Ausweg, risikoreiche Vorgänge

3. Nutzungsfunktionen

:

a. reinterpret_cast dient der Neuinterpretation der Daten von Die unterste Ebene weist je nach Plattform eine schlechte Portabilität auf

b. Reinterpret_cast kann Ganzzahlen in Zeiger oder Zeiger in Arrays konvertieren

c. reinterpret_cast kann skrupellose Konvertierungen in Zeiger und Referenzen durchführen

int doSomething(){return 0;};//FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 voidtypedef void(*FuncPtr)();//10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存//入funcPtrArray数组:FuncPtr funcPtrArray[10];

funcPtrArray[0] = &doSomething;// 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArrayfuncPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);//不同函数指针类型之间进行转换

总结:

去const属性用const_cast。

基本类型转换用static_cast。

多态类之间的类型转换用daynamic_cast。

不同类型的指针类型转换用reinterpreter_cast。

相关文章:

C++ 的强制类型转换

【c#教程】C# 类型转换

相关视频:

PHP数据类型转换之自动类型转换

Das obige ist der detaillierte Inhalt vonVier Arten von Umwandlungen in C++_Basic-Verwendung und Verwendungsszenarien. 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