Exercice 105
Énoncé
Soit une classe point ainsi définie (nous ne fournissons pas la définition de son
constructeur) :
class point
{ int x, y ;
public :
point (int = 0, int = 0) ;
friend int operator == (point, point) ;
} ;
int operator == (point a, point b)
{ return a.x == b.x && a.y == b.y ;
}
Soit la classe pointcol, dérivée de point :
class pointcol : public point
{ int cl ;
public :
pointcol (int = 0, int = 0, int = 0) ;
// éventuelles fonctions membre
} ;
a. Si a et b sont de type pointcol et p de type point, les instructions suivantes sont-elles
correctes et, si oui, que font-elles ?
if (a == b) ... // instruction 1
if (a == p) ... // instruction 2
if (p == a) ... // instruction 3
if (a == 5) ... // instruction 4
if (5 == a) ... // instruction 5
b. Mêmes questions, en supposant, cette fois, que l’opérateur + a été défini au sein de
point, sous forme d’une fonction membre.
a. Les 5 instructions proposées sont correctes. D’une manière générale, x == y est
interprété comme operator == (x, y). Si x et y sont de type point, aucun problème ne se
pose bien sûr. Si l’un des opérandes est de type pointcol (ou les deux), il sera
converti implicitement dans le type point. Si l’un des opérandes est de type int, il
sera converti implicitement dans le type point (par utilisation du constructeur à un
argument de point).
En ce qui concerne la signification de la comparaison, on voit qu’elle revient à ne
considérer d’un objet de type pointcol que ses coordonnées. Pour un entier, elle
250
Énoncé
Soit une classe point ainsi définie (nous ne fournissons pas la définition de son
constructeur) :
class point
{ int x, y ;
public :
point (int = 0, int = 0) ;
friend int operator == (point, point) ;
} ;
int operator == (point a, point b)
{ return a.x == b.x && a.y == b.y ;
}
Soit la classe pointcol, dérivée de point :
class pointcol : public point
{ int cl ;
public :
pointcol (int = 0, int = 0, int = 0) ;
// éventuelles fonctions membre
} ;
a. Si a et b sont de type pointcol et p de type point, les instructions suivantes sont-elles
correctes et, si oui, que font-elles ?
if (a == b) ... // instruction 1
if (a == p) ... // instruction 2
if (p == a) ... // instruction 3
if (a == 5) ... // instruction 4
if (5 == a) ... // instruction 5
b. Mêmes questions, en supposant, cette fois, que l’opérateur + a été défini au sein de
point, sous forme d’une fonction membre.
a. Les 5 instructions proposées sont correctes. D’une manière générale, x == y est
interprété comme operator == (x, y). Si x et y sont de type point, aucun problème ne se
pose bien sûr. Si l’un des opérandes est de type pointcol (ou les deux), il sera
converti implicitement dans le type point. Si l’un des opérandes est de type int, il
sera converti implicitement dans le type point (par utilisation du constructeur à un
argument de point).
En ce qui concerne la signification de la comparaison, on voit qu’elle revient à ne
considérer d’un objet de type pointcol que ses coordonnées. Pour un entier, elle
250
