logo

static_cast en C++

Un opérateur Cast est un opérateur unaire ce qui force un type de données à être converti en un autre type de données.

C++ prend en charge 4 types de conversion :



  1. Casting statique
  2. Diffusion dynamique
  3. Stars du Cinéma
  4. Réinterpréter le casting

Cet article se concentre sur la discussion détaillée de static_cast.

Casting statique

Il s’agit du type de plâtre le plus simple pouvant être utilisé. C'est un diffusion au moment de la compilation . Il effectue des choses comme des conversions implicites entre types (comme int vers float ou pointeur vers void*), et il peut également appeler des fonctions de conversion explicites.

Syntaxe de static_cast

 static_cast < dest_type>(source);>

La valeur de retour de static_cast sera de dest_type.



Exemple de static_cast

Vous trouverez ci-dessous le programme C++ pour implémenter static_cast :

C++






// C++ Program to demonstrate> // static_cast> #include> using> namespace> std;> // Driver code> int> main()> {> >float> f = 3.5;> >// Implicit type case> >// float to int> >int> a = f;> >cout <<>'The Value of a: '> << a;> >// using static_cast for float to int> >int> b =>static_cast><>int>>(f);> >cout <<>' The Value of b: '> << b;> }>

>

>

Sortir

The Value of a: 3 The Value of b: 3>

Le comportement de static_cast pour différents scénarios

1. static_cast pour les pointeurs de types de données primitifs :

Apportons maintenant quelques modifications au code ci-dessus.

C++




// C++ Program to demonstrate> // static_cast char* to int*> #include> using> namespace> std;> // Driver code> int> main()> {> >int> a = 10;> >char> c =>'a'>;> > >// Pass at compile time,> >// may fail at run time> >int>* q = (>int>*)&c;> >int>* p =>static_cast><>int>*>(&c);> >return> 0;> }>

comment renvoyer un tableau en Java

>

>

Sortir

error: invalid 'static_cast' from type 'int*' to type 'char*'>

Explication: Cela signifie que même si vous pensez pouvoir transtyper un pointeur d'objet particulier dans un autre mais que c'est illégal, static_cast ne vous permettra pas de le faire.

2. Conversion d'un objet à l'aide d'un opérateur de conversion défini par l'utilisateur

static_cast est capable d'appeler l'opérateur de conversion de la classe s'il est défini. Prenons un autre exemple de conversion d'un objet vers et depuis une classe.

Exemple:

C++




// C++ Program to cast> // class object to string> // object> #include> #include> using> namespace> std;> // new class> class> integer {> >int> x;> public>:> >// constructor> >integer(>int> x_in = 0)> >: x{ x_in }> >{> >cout <<>'Constructor Called'> << endl;> >}> >// user defined conversion operator to string type> >operator string()> >{> >cout <<>'Conversion Operator Called'> << endl;> >return> to_string(x);> >}> };> // Driver code> int> main()> {> >integer obj(3);> >string str = obj;> >obj = 20;> >// using static_cast for typecasting> >string str2 =>static_cast>(obj);> >obj =>static_cast>(30);> >return> 0;> }>

>

>

Sortir

Constructor Called Conversion Operator Called Constructor Called Conversion Operator Called Constructor Called>

Explication: Essayons de comprendre le résultat ci-dessus ligne par ligne :

  1. Quand obj est créé puis le constructeur est appelé qui dans notre cas est également un constructeur de conversion (pour C++14, les règles sont un peu modifiées).
  2. Quand vous créez str hors de obj , le compilateur ne générera pas d'erreur car nous avons défini l'opérateur Conversion.
  3. Quand tu fais obj = 20 , vous appelez en fait le constructeur de conversion.
  4. Quand tu fais str2 hors de static_cast , c'est assez similaire à une chaîne str = obj ; mais avec une vérification de type stricte.
  5. Quand tu écris obj = static_cast (30) , vous convertissez 30 en un entier en utilisant static_cast.

3. static_cast pour l'héritage en C++

static_cast peut fournir à la fois une conversion ascendante et descendante en cas d'héritage. L'exemple suivant montre l'utilisation de static_cast dans le cas d'un upcasting.

Exemple:

long pour chaîner Java

C++




// C++ Program to demonstrate> // static_cast in inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived :>public> Base> {};> // Driver code> int> main()> {> >Derived d1;> > >// Implicit cast allowed> >Base* b1 = (Base*)(&d1);> > >// upcasting using static_cast> >Base* b2 =>static_cast>(&d1);> >return> 0;> }>

>

>

Explication: Le code ci-dessus sera compilé sans aucune erreur.

  1. Nous avons pris l'adresse de d1 et l'avons explicitement convertie en Base et l'avons stockée dans b1.
  2. Nous avons pris l'adresse de d1 et utilisé static_cast pour la convertir en Base et l'avons stockée dans b2.

Dans l'exemple ci-dessus, nous avons hérité de la classe de base en tant que public. Que se passe-t-il lorsque nous en héritons en tant que privé ? L'exemple ci-dessous démontre ce qui suit :

Exemple:

C++




// C++ program to demonstrate> // static_cast in case of> // private inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived:>private> Base> {> >// Inherited private/protected> >// not public> };> // Driver code> int> main()> {> >Derived d1;> > >// Implicit type cast allowed> >Base* b1 = (Base*)(&d1);> > >// static_cast not allowed> >Base* b2 =>static_cast>(&d1);> >return> 0;> }>

>

>

Erreur de compilation :

[Error] 'Base' is an inaccessible base of 'Derived'>

Explication: Le code ci-dessus sera pas compiler même si vous en héritez comme protégé .

Donc pour utiliser static_cast en cas d'héritage, la classe de base doit être accessible, non virtuelle et sans ambiguïté.

4. static_cast pour lancer un pointeur vide « vers et depuis »

L’opérateur static_cast permet de convertir n’importe quel type de pointeur en pointeur void et vice versa.

Exemple:

C++




compteur java
// C++ program to demonstrate> // static_cast to cast 'to and> // from' the void pointer> #include> using> namespace> std;> // Driver code> int> main()> {> >int> i = 10;> >void>* v =>static_cast><>void>*>(&i);> >int>* ip =>static_cast><>int>*>(v);> >cout << *ip;> >return> 0;> }>

>

>

Sortir

10>