SlideShare a Scribd company logo
1 of 4
Download to read offline
Chapitre VIII
Conversions
• En plus des conversions implicites ou explicites (cast) définies dans C, C++ offre la
possibilité de définir des conversions d'un type classe vers un autre type classe ou un
type de base.
• De telles conversions, dites conversions définies par l'utilisateur, peuvent être définies
soit par les constructeurs à un seul argument, soit par la surcharge de l'opérateur de
cast.
• Les conversions, ainsi définies, peuvent être appelées explicitement ou implicitement
par le compilateur. Le compilateur fait appel à l'une des conversions définies par
l'utilisateur, s'il ne peut appliquer une conversion standard.
• Notez que le compilateur cherche à appliquer implicitement une conversion chaque
fois qu'il trouve (dans une initialisation, l'argument d'une fonction, le paramètre de
retour d'une fonction, lors de l'évaluation d'une expression, etc.…) un objet dont le
type ne correspond pas au type attendu.
• D'autre part, le compilateur ne cherche pas des conversions intermédiaires pour
réaliser une autre. Si par exemple une conversion est définie d'un type A vers un type
B, et une autre est définie de ce type B vers un type C, le compilateur ne peut pas
utiliser implicitement ces deux conversions pour réaliser une conversion de A vers C.
Conversions 76
VIII.1 Conversion définie par le constructeur
• Un constructeur avec un seul argument réalise une conversion du type de cet argument
vers le type de sa classe, et ce quelque soit le type de cet argument.
• Notez que ce type de conversion ne peut être utilisé pour définir les conversions de
type classe vers un type de base.
Exemple 8.1 : (EXP08_01.CPP)
L'exemple suivant montre comment le constructeur de la classe point à un seul
argument de type int définit une conversion de int vers point
class point{
int x;
int y;
public:
point(): x(0), y(0){}
point(int abs ): x(abs), y(abs){}
point(int abs, int ord): x(abs), y(ord){}
void affiche(){
cout << "(" << x << "," << y << ")" << endl;
}
};
// fonction avec argument de type point
void fct(point pt){
pt.affiche();
}
//--------------------- TEST
int main()
{
point a;
// conversion implicite de int -> point lors d'une affectation
a = 6;
a.affiche();
// conversion implicite de int -> point lors de l'appel d'une fonction
fct(7);
// conversion explicite
((point)5).affiche();
return 0;
}
VIII.2 Opérateur de cast
• Pour définir l'opérateur de conversion d'une classe T vers un type A, on utilise la
fonction membre :
operator A ();
• Notez que :
 Cette fonction membre doit retourner une valeur de type A.
 le type de retour ne doit pas figurer dans l'entête de la fonction.
 la fonction ne prend aucun argument.
Conversions 77
Exemple 8.2 : (EXP08_02.CPP)
On considère dans cet exemple une conversion de point vers un entier
class point{
int x;
int y;
public:
point(int abs = 0, int ord = 0):x(abs), y(ord){}
operator int(){
return x;
}
};
//--------------------- TEST
int main()
{
point a(5,6);
int i,j;
// conversion implicite de point -> int
i = a;
cout << i << endl; // i = 5
// conversion lors d'une expression
j = a + 4; // j = 9
cout << j << endl;
return 0;
}
VIII.3 Problèmes posées par le transtypage
• Les conversions définies par l'utilisateur doivent être sans ambiguïtés, autrement dit,
on ne peut avoir plusieurs chaînes de conversions qui conduisent vers un même type :
Plusieurs problèmes peuvent être posés, lorsqu’on définit dans une classe des conversions.
On peur citer par exemple, les cas suivants :
1. Une classe qui définit deux conversions vers des types de bases :
Exemple 8.3 : (EXP08_03.CPP)
On définit pour une classe T, deux conversions, une vers int et l’autre vers double.
class T{
int n;
public:
T(int k = 0): n(0){}
operator int(){return n;}
operator double(){ return (double) n;}
};
int main()
{
T a;
double r;
r = 2.5 + a; //ambiguïté
return 0;
}
Ici, deux opérateurs prédéfinis peuvent être appliqués operator+(double,double)
et operator+(double,int). Par suite, le compilateur ne peut choisir entre l’une des
deux.
Conversions 78
2. Une classe qui définit une conversion vers un type de base, et surcharge certains
opérateurs :
Exemple 8.4 : (EXP08_04.CPP)
On définit pour la classe point, une conversion vers int et on surcharge l’opérateur +.
class point{
int x;
int y;
public:
point(): x(0), y(0){}
point(int abs ): x(abs), y(abs){}
point(int abs, int ord): x(abs), y(ord){}
operator int() {return x;}
friend point operator+(point,point);
};
point operator+(point u, point v){
point temp;
temp.x = u.x + v.x;
temp.y = u.y + v.y;
return temp;
}
//--------------------- TEST
int main()
{
point a(5,6);
point b;
b = a + 4; //ambiguïté
return 0;
}
Ici, le compilateur ne peut choisir entre les deux opérateurs candidats
operator+(point,point) et operator+(int,int).

More Related Content

What's hot

Algorithme & structures de données Chap III
Algorithme & structures de données Chap IIIAlgorithme & structures de données Chap III
Algorithme & structures de données Chap IIIInes Ouaz
 
algorithme tronc commun lycée
algorithme tronc commun lycéealgorithme tronc commun lycée
algorithme tronc commun lycéeKayl Mido
 
Corrigé langage c
Corrigé langage cCorrigé langage c
Corrigé langage ccoursuniv
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Aziz Darouichi
 
Formation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduraleFormation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduralekemenaran
 
Les fondamentaux de langage C#
Les fondamentaux de langage C#Les fondamentaux de langage C#
Les fondamentaux de langage C#Youness Boukouchi
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Aziz Darouichi
 
Algorithme & structures de données Chap II
Algorithme & structures de données Chap IIAlgorithme & structures de données Chap II
Algorithme & structures de données Chap IIInes Ouaz
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage PythonAziz Darouichi
 
Langage C
Langage  CLangage  C
Langage Cjwilili
 
Fiche1 ex-sous-programme
Fiche1 ex-sous-programmeFiche1 ex-sous-programme
Fiche1 ex-sous-programmeBaghdadi Wajih
 

What's hot (20)

Algorithme & structures de données Chap III
Algorithme & structures de données Chap IIIAlgorithme & structures de données Chap III
Algorithme & structures de données Chap III
 
algorithme tronc commun lycée
algorithme tronc commun lycéealgorithme tronc commun lycée
algorithme tronc commun lycée
 
Corrigé langage c
Corrigé langage cCorrigé langage c
Corrigé langage c
 
Chap2fonctionscpp
Chap2fonctionscppChap2fonctionscpp
Chap2fonctionscpp
 
Chapitre 04 : les fonctions
Chapitre 04 : les fonctionsChapitre 04 : les fonctions
Chapitre 04 : les fonctions
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019
 
Formation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduraleFormation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procédurale
 
TP C++ : enoncé
TP C++ : enoncéTP C++ : enoncé
TP C++ : enoncé
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
Les fondamentaux de langage C#
Les fondamentaux de langage C#Les fondamentaux de langage C#
Les fondamentaux de langage C#
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références
 
Programmation en C
Programmation en CProgrammation en C
Programmation en C
 
Algorithme & structures de données Chap II
Algorithme & structures de données Chap IIAlgorithme & structures de données Chap II
Algorithme & structures de données Chap II
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Langage C
Langage  CLangage  C
Langage C
 
Fiche1 ex-sous-programme
Fiche1 ex-sous-programmeFiche1 ex-sous-programme
Fiche1 ex-sous-programme
 
Algorithmique
AlgorithmiqueAlgorithmique
Algorithmique
 
Algorithmique
AlgorithmiqueAlgorithmique
Algorithmique
 
Le langage C
Le langage CLe langage C
Le langage C
 

Viewers also liked

Viewers also liked (20)

Mi vida
Mi vidaMi vida
Mi vida
 
¿Cómo se integran la comunicación científica y las competencias informacionales?
¿Cómo se integran la comunicación científica y las competencias informacionales?¿Cómo se integran la comunicación científica y las competencias informacionales?
¿Cómo se integran la comunicación científica y las competencias informacionales?
 
Summary salon vert
Summary salon vertSummary salon vert
Summary salon vert
 
"L'eau du baptême nous sauve de nos péchés"
"L'eau du baptême nous sauve de nos péchés""L'eau du baptême nous sauve de nos péchés"
"L'eau du baptême nous sauve de nos péchés"
 
Burj-al-arab
Burj-al-arabBurj-al-arab
Burj-al-arab
 
Choferezas!
Choferezas!Choferezas!
Choferezas!
 
French
FrenchFrench
French
 
Roma en fotos
Roma en fotosRoma en fotos
Roma en fotos
 
Cocodrilo
CocodriloCocodrilo
Cocodrilo
 
Las Mejores Imagenes De Internet
Las Mejores Imagenes De InternetLas Mejores Imagenes De Internet
Las Mejores Imagenes De Internet
 
ImáGenes De Cuba Guillermo
ImáGenes De Cuba   GuillermoImáGenes De Cuba   Guillermo
ImáGenes De Cuba Guillermo
 
La tecnologia, un aliat per aprendre
La tecnologia, un aliat per aprendreLa tecnologia, un aliat per aprendre
La tecnologia, un aliat per aprendre
 
Publicidad Inteligente
Publicidad InteligentePublicidad Inteligente
Publicidad Inteligente
 
Premiers pas
Premiers pasPremiers pas
Premiers pas
 
ALFIN 2.0
ALFIN 2.0ALFIN 2.0
ALFIN 2.0
 
Taller (II) "Aprovechamiento de las tecnologías y la gestión del contenido e...
Taller (II)  "Aprovechamiento de las tecnologías y la gestión del contenido e...Taller (II)  "Aprovechamiento de las tecnologías y la gestión del contenido e...
Taller (II) "Aprovechamiento de las tecnologías y la gestión del contenido e...
 
Los archivos de Joaquín González Moreno (1ª parte)
Los archivos de Joaquín González Moreno (1ª parte)Los archivos de Joaquín González Moreno (1ª parte)
Los archivos de Joaquín González Moreno (1ª parte)
 
Models didàctics amb la PDI
Models didàctics amb la PDIModels didàctics amb la PDI
Models didàctics amb la PDI
 
Gula Schanitzel Escalopa
Gula Schanitzel Escalopa Gula Schanitzel Escalopa
Gula Schanitzel Escalopa
 
Word HGF Gc
Word HGF GcWord HGF Gc
Word HGF Gc
 

Similar to Ch08

CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSiratiSoufiane
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSSAyoubElmrabet6
 
Découvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDécouvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDotNetHub
 
Ch2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfCh2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfFadouaBouafifSamoud
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 
Les bases de la programmation en JAVA
Les bases de la programmation  en JAVA   Les bases de la programmation  en JAVA
Les bases de la programmation en JAVA Asmaa BENGUEDDACH
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMALoic Yon
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Rahma Boufalgha
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)Tunisie collège
 

Similar to Ch08 (20)

CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
Ch02
Ch02Ch02
Ch02
 
Découvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDécouvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCL
 
Ch04
Ch04Ch04
Ch04
 
Ch2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfCh2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdf
 
Ch06
Ch06Ch06
Ch06
 
Ch07
Ch07Ch07
Ch07
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Memo java
Memo javaMemo java
Memo java
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 
De Java à .NET
De Java à .NETDe Java à .NET
De Java à .NET
 
Ch10
Ch10Ch10
Ch10
 
Ch13
Ch13Ch13
Ch13
 
Les bases de la programmation en JAVA
Les bases de la programmation  en JAVA   Les bases de la programmation  en JAVA
Les bases de la programmation en JAVA
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMA
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
 
Language-C.ppt
Language-C.pptLanguage-C.ppt
Language-C.ppt
 
Ch03
Ch03Ch03
Ch03
 

More from yarsenv47

Algevre de bool
Algevre de boolAlgevre de bool
Algevre de boolyarsenv47
 
Numeration et codage_de_linfo
Numeration et codage_de_linfoNumeration et codage_de_linfo
Numeration et codage_de_linfoyarsenv47
 
S3 cours architectureord
S3 cours architectureordS3 cours architectureord
S3 cours architectureordyarsenv47
 
Language C++ Ch01
Language C++ Ch01 Language C++ Ch01
Language C++ Ch01 yarsenv47
 

More from yarsenv47 (9)

Js cours
 Js cours Js cours
Js cours
 
Algevre de bool
Algevre de boolAlgevre de bool
Algevre de bool
 
Numeration et codage_de_linfo
Numeration et codage_de_linfoNumeration et codage_de_linfo
Numeration et codage_de_linfo
 
S3 cours architectureord
S3 cours architectureordS3 cours architectureord
S3 cours architectureord
 
Ch12
Ch12Ch12
Ch12
 
Ch11
Ch11Ch11
Ch11
 
Ch09
Ch09Ch09
Ch09
 
Ch05
Ch05Ch05
Ch05
 
Language C++ Ch01
Language C++ Ch01 Language C++ Ch01
Language C++ Ch01
 

Ch08

  • 1. Chapitre VIII Conversions • En plus des conversions implicites ou explicites (cast) définies dans C, C++ offre la possibilité de définir des conversions d'un type classe vers un autre type classe ou un type de base. • De telles conversions, dites conversions définies par l'utilisateur, peuvent être définies soit par les constructeurs à un seul argument, soit par la surcharge de l'opérateur de cast. • Les conversions, ainsi définies, peuvent être appelées explicitement ou implicitement par le compilateur. Le compilateur fait appel à l'une des conversions définies par l'utilisateur, s'il ne peut appliquer une conversion standard. • Notez que le compilateur cherche à appliquer implicitement une conversion chaque fois qu'il trouve (dans une initialisation, l'argument d'une fonction, le paramètre de retour d'une fonction, lors de l'évaluation d'une expression, etc.…) un objet dont le type ne correspond pas au type attendu. • D'autre part, le compilateur ne cherche pas des conversions intermédiaires pour réaliser une autre. Si par exemple une conversion est définie d'un type A vers un type B, et une autre est définie de ce type B vers un type C, le compilateur ne peut pas utiliser implicitement ces deux conversions pour réaliser une conversion de A vers C.
  • 2. Conversions 76 VIII.1 Conversion définie par le constructeur • Un constructeur avec un seul argument réalise une conversion du type de cet argument vers le type de sa classe, et ce quelque soit le type de cet argument. • Notez que ce type de conversion ne peut être utilisé pour définir les conversions de type classe vers un type de base. Exemple 8.1 : (EXP08_01.CPP) L'exemple suivant montre comment le constructeur de la classe point à un seul argument de type int définit une conversion de int vers point class point{ int x; int y; public: point(): x(0), y(0){} point(int abs ): x(abs), y(abs){} point(int abs, int ord): x(abs), y(ord){} void affiche(){ cout << "(" << x << "," << y << ")" << endl; } }; // fonction avec argument de type point void fct(point pt){ pt.affiche(); } //--------------------- TEST int main() { point a; // conversion implicite de int -> point lors d'une affectation a = 6; a.affiche(); // conversion implicite de int -> point lors de l'appel d'une fonction fct(7); // conversion explicite ((point)5).affiche(); return 0; } VIII.2 Opérateur de cast • Pour définir l'opérateur de conversion d'une classe T vers un type A, on utilise la fonction membre : operator A (); • Notez que :  Cette fonction membre doit retourner une valeur de type A.  le type de retour ne doit pas figurer dans l'entête de la fonction.  la fonction ne prend aucun argument.
  • 3. Conversions 77 Exemple 8.2 : (EXP08_02.CPP) On considère dans cet exemple une conversion de point vers un entier class point{ int x; int y; public: point(int abs = 0, int ord = 0):x(abs), y(ord){} operator int(){ return x; } }; //--------------------- TEST int main() { point a(5,6); int i,j; // conversion implicite de point -> int i = a; cout << i << endl; // i = 5 // conversion lors d'une expression j = a + 4; // j = 9 cout << j << endl; return 0; } VIII.3 Problèmes posées par le transtypage • Les conversions définies par l'utilisateur doivent être sans ambiguïtés, autrement dit, on ne peut avoir plusieurs chaînes de conversions qui conduisent vers un même type : Plusieurs problèmes peuvent être posés, lorsqu’on définit dans une classe des conversions. On peur citer par exemple, les cas suivants : 1. Une classe qui définit deux conversions vers des types de bases : Exemple 8.3 : (EXP08_03.CPP) On définit pour une classe T, deux conversions, une vers int et l’autre vers double. class T{ int n; public: T(int k = 0): n(0){} operator int(){return n;} operator double(){ return (double) n;} }; int main() { T a; double r; r = 2.5 + a; //ambiguïté return 0; } Ici, deux opérateurs prédéfinis peuvent être appliqués operator+(double,double) et operator+(double,int). Par suite, le compilateur ne peut choisir entre l’une des deux.
  • 4. Conversions 78 2. Une classe qui définit une conversion vers un type de base, et surcharge certains opérateurs : Exemple 8.4 : (EXP08_04.CPP) On définit pour la classe point, une conversion vers int et on surcharge l’opérateur +. class point{ int x; int y; public: point(): x(0), y(0){} point(int abs ): x(abs), y(abs){} point(int abs, int ord): x(abs), y(ord){} operator int() {return x;} friend point operator+(point,point); }; point operator+(point u, point v){ point temp; temp.x = u.x + v.x; temp.y = u.y + v.y; return temp; } //--------------------- TEST int main() { point a(5,6); point b; b = a + 4; //ambiguïté return 0; } Ici, le compilateur ne peut choisir entre les deux opérateurs candidats operator+(point,point) et operator+(int,int).