Exercice 86
Énoncé
Soit la classe vecteur3d ainsi définie :
class vecteur3d
{
float v[3] ;
public :
vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
{ // à compléter
}
} ;
Compléter la définition du constructeur (en ligne), puis définir l’opérateur [] pour
qu’il permette d’accéder à l’une des trois composantes d’un vecteur, et cela aussi
bien au sein d’une expression ( ... = v1[i]) qu’à gauche d’un opérateur d’affectation
(v1[i] = ...) ; de plus, on cherchera à se protéger contre d’éventuels risques de
débordement d’indice.
La définition du constructeur ne pose aucun problème. En ce qui concerne l’opérateur
[], C++ ne permet de le surdéfinir que sous la forme d’une fonction membre (cette
exception est justifiée par le fait que l’objet concerné ne doit pas risquer d’être soumis
à une conversion, lorsqu’il apparaît à gauche d’une affectation). Elle possédera donc
un seul argument de type int et elle renverra un résultat de type vecteur3d.
Pour que notre opérateur puisse être utilisé à gauche d’une affectation, il faut
absolument que le résultat soit renvoyé par référence. Pour nous protéger d’un éventuel
débordement d’indice, nous avons simplement prévu que toute tentative d’accès à un
élément en dehors des limites conduirait à accéder au premier élément.
Voici la déclaration de notre classe, accompagnée de la définition de la fonction
operator [] :
class vecteur3d
{
float v [3] ;
public :
vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
{ v[0] = c1 ; v[1] = c2 ; v[2] = c3 ;
}
float & operator [] ( int) ;
} ;
float & vecteur3d::operator [] (int i)
{ if ( (i<0) || (i>2) ) i = 0 ; // pour éviter un "débordement"
203
Énoncé
Soit la classe vecteur3d ainsi définie :
class vecteur3d
{
float v[3] ;
public :
vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
{ // à compléter
}
} ;
Compléter la définition du constructeur (en ligne), puis définir l’opérateur [] pour
qu’il permette d’accéder à l’une des trois composantes d’un vecteur, et cela aussi
bien au sein d’une expression ( ... = v1[i]) qu’à gauche d’un opérateur d’affectation
(v1[i] = ...) ; de plus, on cherchera à se protéger contre d’éventuels risques de
débordement d’indice.
La définition du constructeur ne pose aucun problème. En ce qui concerne l’opérateur
[], C++ ne permet de le surdéfinir que sous la forme d’une fonction membre (cette
exception est justifiée par le fait que l’objet concerné ne doit pas risquer d’être soumis
à une conversion, lorsqu’il apparaît à gauche d’une affectation). Elle possédera donc
un seul argument de type int et elle renverra un résultat de type vecteur3d.
Pour que notre opérateur puisse être utilisé à gauche d’une affectation, il faut
absolument que le résultat soit renvoyé par référence. Pour nous protéger d’un éventuel
débordement d’indice, nous avons simplement prévu que toute tentative d’accès à un
élément en dehors des limites conduirait à accéder au premier élément.
Voici la déclaration de notre classe, accompagnée de la définition de la fonction
operator [] :
class vecteur3d
{
float v [3] ;
public :
vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
{ v[0] = c1 ; v[1] = c2 ; v[2] = c3 ;
}
float & operator [] ( int) ;
} ;
float & vecteur3d::operator [] (int i)
{ if ( (i<0) || (i>2) ) i = 0 ; // pour éviter un "débordement"
203
