Exercice 96
É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 ;
}
} ;
main()
{ point a(1,5), b(2,8) ;
int n1, n2, n3 ;
n1 = a + 3 ; // instruction 1
cout << "n1 = " << n1 << "\n" ;
n2 = a + b ; // instruction 2
cout << "n2 = " << n2 << "\n" ;
double z1, z2 ;
z1 = a + 3 ; // instruction 3
cout << "z1 = " << z1 << "\n" ;
z2 = a + b ; // instruction 4
cout << "z2 = " << z2 << "\n" ;
}
Lorsque le compilateur rencontre, dans l’instruction 1, l’expression a + 3, il cherche
tout d’abord s’il existe un opérateur surdéfini correspondant aux types point et int (dans
cet ordre). Ici, il n’en trouve pas. Il va alors chercher à mettre en place des conversions
permettant d’aboutir à une opération existante ; ici, l’opérateur de cast (operator int) lui
permet de se ramener à une addition d’entiers (par conversion de p en int), et c’est la
seule possibilité. Le résultat est alors, bien sûr, de type int et il est affecté à n1 sans
conversion.
Le même raisonnement s’applique à l’instruction 2 ; l’évaluation de a + b se fait alors
par conversion de a et de b en int (seule possibilité de donner une signification à
l’opérateur +). Le résultat est de type int et il est affecté sans conversion à n2.
Les expressions figurant à droite des affectations des instructions 3 et 4 sont évaluées
exactement suivant les mêmes règles que les expressions des instructions 1 et 2. Ce
n’est qu’au moment de l’affectation du résultat (de type int) à la variable mentionnée
230
Précédent

- 231/398

Suivant