Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais
Nous recommandons d’utiliser Visual Studio 2017

Inconvénients des constructeurs de conversion

Étant donné que le compilateur peut sélectionner un constructeur de conversion implicite, vous abandonnez le contrôle sur les fonctions appelées et le moment où elles sont appelées. Il est essentiel de conserver le contrôle total, de ne pas déclarer les constructeurs qui acceptent un argument unique. À la place, définissez les fonctions d'assistance pour effectuer des conversions, comme dans l'exemple suivant :

// spec1_drawbacks_of_conversion_constructors.cpp
// compile with: /EHsc
#include <stdio.h>
#include <stdlib.h>

// Declare Money class.
class Money {
public:
   Money();

   // Define conversion functions that can only be called explicitly.
   static Money Convert( char * ch ) { return Money( ch ); }
   static Money Convert( double d )    { return Money( d ); };
   void  Print() { printf_s( "%f\n", _amount ); }

private:
   Money( char *ch ) { _amount = atof( ch ); }
   Money( double d ) { _amount = d; }
   double _amount;
};

int main() {
   // Perform a conversion from type char * to type Money.
   Money Acct = Money::Convert( "57.29" );
   Acct.Print();

   // Perform a conversion from type double to type Money.
   Acct = Money::Convert( 33.29 );
   Acct.Print();
}
57.290000
33.290000

Dans le code précédent, les constructeurs de conversion sont privés et ne peuvent pas être utilisés dans les conversions de type. Toutefois, ils peuvent être appelés explicitement en appelant les fonctions Convert. Les fonctions Convert étant statiques, elles sont accessibles sans référencer un objet particulier.

Afficher: