Rappels
C++ vous permet de définir des conversions d’un type classe vers un autre type classe
ou un type de base. On parle de conversions définies par l’utilisateur (en abrégé :
C.D.U.). Ces conversions peuvent alors éventuellement être mises en œuvre de façon
implicite par le compilateur, afin de donner une signification à un appel de fonction ou
à un opérateur (sans conversion, l’appel ou l’opérateur serait illégal). On retrouve
ainsi des possibilités comparables à celles qui nous sont offertes par le C en matière de
conversions implicites.
Deux sortes de fonctions (obligatoirement des fonctions membre) permettent de définir
des C.D.U. :
les constructeurs à un argument (quel que soit le type de cet argument) réalisent une
conversion du type de cet argument dans le type de sa classe ; on peut cependant
utiliser le mot-clé explicit devant la déclaration du constructeur pour en interdire
l’utilisation dans une conversion implicite ;
les opérateurs de cast ; dans une classe A, on définira un opérateur de conversion d’un
type x (quelconque, c’est-à-dire aussi bien un type de base qu’un autre type classe)
en introduisant la fonction membre de prototype :
operator x () ;
Notez que le type de la valeur de retour (obligatoirement défini par son nom) ne doit
pas figurer dans l’en-tête ou le prototype d’une telle fonction.
Les règles d’utilisation des C.D.U. rejoignent celles concernant le choix d’une fonction
surdéfinie :
Les C.D.U. ne sont mises en œuvre que si cela est nécessaire.
Une seule C.D.U. peut intervenir dans une chaîne de conversions (d’un argument
d’une fonction ou d’un opérande d’un opérateur).
Il ne doit pas y avoir d’ambiguïté, c’est-à-dire plusieurs chaînes de conversions
conduisant au même type, pour un argument ou un opérande donné.
N. B. Aucune conversion n’est réalisable sur un argument effectif en cas de
transmission par référence, sauf si l’argument muet correspondant est déclaré avec
l’attribut const ; dans ce dernier cas, on retrouve les mêmes possibilités de conversion
qu’en cas de transmission par valeur.
227
C++ vous permet de définir des conversions d’un type classe vers un autre type classe
ou un type de base. On parle de conversions définies par l’utilisateur (en abrégé :
C.D.U.). Ces conversions peuvent alors éventuellement être mises en œuvre de façon
implicite par le compilateur, afin de donner une signification à un appel de fonction ou
à un opérateur (sans conversion, l’appel ou l’opérateur serait illégal). On retrouve
ainsi des possibilités comparables à celles qui nous sont offertes par le C en matière de
conversions implicites.
Deux sortes de fonctions (obligatoirement des fonctions membre) permettent de définir
des C.D.U. :
les constructeurs à un argument (quel que soit le type de cet argument) réalisent une
conversion du type de cet argument dans le type de sa classe ; on peut cependant
utiliser le mot-clé explicit devant la déclaration du constructeur pour en interdire
l’utilisation dans une conversion implicite ;
les opérateurs de cast ; dans une classe A, on définira un opérateur de conversion d’un
type x (quelconque, c’est-à-dire aussi bien un type de base qu’un autre type classe)
en introduisant la fonction membre de prototype :
operator x () ;
Notez que le type de la valeur de retour (obligatoirement défini par son nom) ne doit
pas figurer dans l’en-tête ou le prototype d’une telle fonction.
Les règles d’utilisation des C.D.U. rejoignent celles concernant le choix d’une fonction
surdéfinie :
Les C.D.U. ne sont mises en œuvre que si cela est nécessaire.
Une seule C.D.U. peut intervenir dans une chaîne de conversions (d’un argument
d’une fonction ou d’un opérande d’un opérateur).
Il ne doit pas y avoir d’ambiguïté, c’est-à-dire plusieurs chaînes de conversions
conduisant au même type, pour un argument ou un opérande donné.
N. B. Aucune conversion n’est réalisable sur un argument effectif en cas de
transmission par référence, sauf si l’argument muet correspondant est déclaré avec
l’attribut const ; dans ce dernier cas, on retrouve les mêmes possibilités de conversion
qu’en cas de transmission par valeur.
227
