Maison  >  Article  >  développement back-end  >  conversion de types c++

conversion de types c++

angryTom
angryTomoriginal
2019-10-26 11:02:085669parcourir

conversion de types c++

Conversion de type C++

En langage C, la conversion de type nécessite uniquement d'ajouter le type de variable devant la variable , et la conversion peut être bidirectionnelle. Par exemple, le type int peut être converti en type double, et le type double peut également être converti en type int. (Tutoriel recommandé : Tutoriel manuel c++)

Mais cette méthode simple et grossière est inappropriée en C++. Premièrement, la classe de types de données personnalisés en C++ ne peut pas être complétée ; deuxièmement, le langage C peut convertir n'importe quel type. Par exemple, un pointeur vers un objet const peut être converti en un pointeur vers un objet non const. Pour le C++, qui a une vérification de type très stricte, cela est évidemment déraisonnable, donc C++ fournit 4 opérateurs de conversion de type uniques.

1. static_cast

est similaire à la conversion de type en langage C et peut effectuer une conversion de type inconditionnelle. Scénarios d'application :

Conversion de type de base.

int i = 1;
double j = static_cast <double> (i);

Conversion entre les pointeurs de classe parent et de sous-classe. Si le pointeur de classe parent pointe vers un objet, il n'est pas sûr de convertir le pointeur de classe parent en pointeur de sous-classe, mais il est prudent de convertir le pointeur de sous-classe en pointeur de classe parent.

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);  // 安全

Convertit tout type d'expression en type void.

Remarque : static_cast ne peut pas supprimer les attributs const ou volatile d'un type ; il ne peut pas effectuer de conversions de type non liées (telles que les classes et sous-classes non de base).

2.dynamic_cast

dynamic_cast ne peut être utilisé que pour convertir entre des pointeurs d'objet, et le résultat de la conversion peut également être appliqué. Lors de l'exécution d'une conversion en amont entre les niveaux de classe, les effets de Dynamic_cast et static_cast sont les mêmes ; lors de l'exécution d'une conversion en aval, Dynamic_cast a une fonction de vérification de type et est plus sûr que 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);  // 转换成功

Remarque : lors de la conversion de pointeurs entre les classes parent et enfant, la classe parent doit contenir une fonction virtuelle.

3. const_cast

est utilisé pour supprimer l'attribut const, supprimer l'attribut const ou volatile du type et changer le pointeur de type const en un non- pointeur de type const.

const int * fun(int x, int y) { }; 
int * ptr = const_cast < int * > (fun(2, 3));

4. reinterpret_cast

reinterpret_cast réinterprète simplement le type, sans conversion binaire. Application :

Le type converti doit être un pointeur, une référence, un type arithmétique, un pointeur de fonction ou un pointeur de membre. La conversion est effectuée au niveau du bit. Il peut convertir un pointeur en entier, ou un entier en pointeur (convertissez d'abord un pointeur en entier, puis convertissez l'entier en un pointeur du type d'origine, et vous pouvez également obtenir la valeur d'origine du pointeur). Cependant, les instances non 32 bits ne peuvent pas être converties en pointeurs.

est généralement utilisé pour convertir entre les types de pointeurs de fonction.

La portabilité n’est pas garantie.

Remarque : cette conversion de type est dangereuse et doit être utilisée avec prudence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:connaissances de base en c++Article suivant:connaissances de base en c++