Exercice 97
Énoncé
Quels résultats fournira le programme suivant :
#include
using namespace std ;
class point
{
int x, y ;
public :
point (int abs, int ord) // constructeur 2 arguments
{ x = abs ; y = ord ;
}
operator int() // "cast" point --> int
{ cout << "** appel int() pour le point " << x << " " << y << "\n" ;
return x ;
}
} ;
void fct (double v)
{ cout << "$$ appel fct avec argument : " << v << "\n" ;
}
main()
{ point a(1,4) ;
int n1 ;
double z1, z2 ;
n1 = a + 1.75 ; // instruction 1
cout << "n1 = " << n1 << "\n" ;
z1 = a + 1.75 ; // instruction 2
cout << "z1 = " << z1 << "\n" ;
z2 = a ; // instruction 3
cout << "z2 = " << z2 << "\n" ;
fct (a) ; // instruction 4
}
Pour évaluer l’expression a + 1.75 de l’instruction 1, le compilateur met en place une
chaîne de conversions de a en double (point --> int suivie de int --> double) de manière à
aboutir à l’addition de deux valeurs de type double ; le résultat, de type double, est ensuite
converti pour être affecté à n1 (conversion forcée par l’affectation, comme d’habitude
en C).
Notez bien qu’il n’est pas question pour le compilateur de prévoir la conversion en int
de la valeur 1.75 (de façon à se ramener à l’addition de deux int, après conversion de a
en int) car il s’agit là d’une « conversion dégradante » qui n’est jamais mise en œuvre
de manière implicite dans un calcul d’expression. Il n’y a donc pas d’autre choix
possible (notez que s’il y en avait effectivement un autre, il ne s’agirait pas pour autant
d’une situation d’ambiguïté dans la mesure où le compilateur appliquerait alors les
232
Précédent

- 233/398

Suivant