using namespace std ;
class vect
{ int nelem ; // nombre de composantes du vecteur
int * adr ; // pointeur sur partie dynamique
public :
vect (int n=1) ; // constructeur "usuel"
vect (vect & v) ; // constructeur par recopie,
// voir remarque 1 ci-après
~vect () ; // destructeur
friend ostream & operator << (ostream &, vect &) ; // sortie sur un flot
vect & operator = (vect & v) ; // surdéfinition opérateur affectation
// voir remarque 2 ci-après
int & operator [] (int i) ; // surdef [] pour vect non constants
int operator [] (int i) const ; // surdef [] pour vect constants
} ;
1. On pourrait ajouter le qualificatif const au constructeur par recopie, ce qui
autoriserait l’initialisation d’un vecteur par un vecteur constant. Mais compte tenu
des possibilités de l’autre constructeur dans des conversions implicites, on
autoriserait du même coup l’initialisation par un entier ou un flottant, ce qui n’est
guère satisfaisant ; on pourrait cependant interdire de telles possibilités en utilisant
le mot-clé explicit dans la déclaration du constructeur.
2. La transmission de la valeur de retour de l’opérateur d’affectation n’est utile que si
l’on souhaite permettre les affectations multiples. Il n’est pas indispensable de
transmettre l’argument et la valeur de retour par référence, mais cela évite les
recopies. On pourrait ici déclarer constant l’unique argument, ce qui autoriserait
l’utilisation d’un objet constant en second opérande de l’affectation (moyennant une
recopie). Mais, du même coup, compte tenu des possibilités de conversions
implicites, on autoriserait également l’utilisation d’un entier ou d’un flottant, ce qui
n’est pas nécessairement souhaité ; là encore, ces possibilités pourraient être
interdites, moyennant l’utilisation appropriée du mot-clé explicit.
Voici la définition des différentes fonctions :
#include "vect.h"
#include
using namespace std ;
vect::vect (int n) // constructeur "usuel"
{ adr = new int [nelem = n] ;
}
vect::vect (vect & v) // constructeur par recopie
{ adr = new int [nelem = v.nelem] ;
int i ;
for (i=0 ; i adr[i] = v.adr[i] ;
}
vect::~vect () // destructeur
{ delete adr ;
}
vect & vect::operator = (vect & v) // surdéfinition opérateur affectation
353
Précédent

- 354/398

Suivant