Académique Documents
Professionnel Documents
Culture Documents
com
www.hittechnologie.com
1ère Edition
HIT-TECHNOLOGY SARL U
PROGRAMMATION ORIENTEE-OBJET :
COURS et EXERCICES CORRIGES
C++ et Qt
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 1 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
PREREQUIS
Connaissance de base en informatique
Connaissance de l‘algorithme et programmation
Notions sur la recherche sur internet
POURQUOI CE LIVRE?
Ce livre répond aux questions des attentes des jeunes, des organisations et toute personne
désirant apprendre la programmation orientée-objet et surtout le langage C++. Le langage
C++ est l‘un des langages les plus utilisés de nos jours du fait de sa facilité d‘utilisation, sa
puissance de construction des interfaces graphiques rapide et facile. Ce livre contient outre le
cours, une collection d‘exercices et corrigés afin de permettre aux apprenants de s‘exercer.
Egalement, un glossaire a été fourni à la fin du livre.
A PROPOS
HIT-TECHNOLOGY (HIT-T) SARL U est un cabinet spécialisé dans le développement des
applications web et mobiles. Il offre également des services tels que : Les formations en
Multimédia, Informatique et Télécommunications, l‘installation des réseaux informatiques, la
maintenance informatique et réseau, la conception et la réalisation de sites web, la conception
et la réalisation des applications web et mobiles, le consulting dans le domaine de mise en
place des bases de données, des systèmes d‘information, la sécurité réseau, pour ne citer que
ces points. Les formations sont offertes dans les filières tertiaires et technologiques. Le
cabinet est enregistré sous le décret n° 2012-008 / PR du 07-03-2012, Arrêté n° 011 /
MCPSP / CAB / DPSP du 13-04-2012.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 2 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
2. Dénomination ................................................................................................................. 13
3. Histoire .......................................................................................................................... 13
4. Fonctionnalités introduites ............................................................................................. 14
5. Bibliothèque standard .................................................................................................... 15
6. Programmation orientée objet ....................................................................................... 15
6.1. Encapsulation .................................................................................................................................. 15
6.1.1. « Hello, world » ...................................................................................................................... 16
6.1.2. Espace de noms ...................................................................................................................... 16
6.1.3. Directive using ........................................................................................................................ 16
6.2. Déclaration et définition de classe ................................................................................................... 19
6.2.1. Déclaration de classe .............................................................................................................. 19
6.2.2. Définition de classe ................................................................................................................ 19
6.3. Templates ........................................................................................................................................ 20
6.3.1. Paramètres des templates ...................................................................................................... 20
6.3.2. Utilité des templates .............................................................................................................. 21
6.3.3. Exemple de templates ............................................................................................................ 21
6.3.4. Spécialisation des templates .................................................................................................. 21
6.3.5. SFINAE .................................................................................................................................... 22
6.4. Polymorphisme et méthodes virtuelles ............................................................................................ 22
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 3 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
9. Compilateurs.................................................................................................................. 23
10. Bibliothèques .............................................................................................................. 24
CONCLUSION............................................................................................................... 24
CHAPITRE II : LES BASES DU LANGAGE C++ ET LA PROGRAMMATION EN
MODE CONSOLE ......................................................................................................... 25
INTRODUCTION .......................................................................................................... 26
I. CONCEPTS DE BASE DU LANGAGE C++............................................................ 26
1. Mots réservés en C++ ..................................................................................................... 26
2. Variables ........................................................................................................................ 26
2.1. Terminologie ................................................................................................................................... 26
2.2. Types de base .................................................................................................................................. 26
2.2.1. Vide ......................................................................................................................................... 26
2.2.2. Entiers ..................................................................................................................................... 26
2.2.3. Réels ....................................................................................................................................... 27
2.2.4. Booléens ................................................................................................................................. 27
2.2.5. Chaînes de caractères ............................................................................................................. 27
2.3. Valeurs littérales (ou explicites) ...................................................................................................... 27
2.3.1. Caractères ............................................................................................................................... 27
2.3.2. Chaînes de caractères ............................................................................................................. 27
2.3.3. Valeurs entières ...................................................................................................................... 27
2.3.4. Valeurs réelles ........................................................................................................................ 27
2.4. Déclaration des variables................................................................................................................. 27
2.5. Déclaration + initialisation .............................................................................................................. 28
3. Expressions .................................................................................................................... 28
3.1. Définition ........................................................................................................................................ 28
3.2. Opérateurs arithmétiques ................................................................................................................. 28
3.3. Opérateurs d‘affectation .................................................................................................................. 29
2.5.1. Egal (=) .................................................................................................................................... 29
2.5.2. Les opérateurs composites ..................................................................................................... 29
3.4. Conversion de type .......................................................................................................................... 29
3.5. Opérateurs d‘entrées-sorties ............................................................................................................ 30
3.6. Formatage des sorties numériques .................................................................................................. 30
4. Instructions .................................................................................................................... 30
4.1. Instruction-expression ..................................................................................................................... 30
4.2. Instruction-bloc ............................................................................................................................... 30
4.3. Structures de contrôle ...................................................................................................................... 31
4.4. Visibilité d‘une variable .................................................................................................................. 31
5. Fonctions........................................................................................................................ 31
5.1. Terminologie ................................................................................................................................... 31
5.2. Déclaration d‘une fonction .............................................................................................................. 32
5.3. Définition d‘une fonction ................................................................................................................ 32
5.4. Utilisation d‘une fonction ................................................................................................................ 32
5.5. Arguments par défaut ...................................................................................................................... 33
5.6. Exemple de programme .................................................................................................................. 33
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 4 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
7. Compléments ................................................................................................................. 41
8. Fonctions utiles .............................................................................................................. 41
9. Eléments du langage....................................................................................................... 42
9.1. Enumérations................................................................................................................................... 42
9.2. Tableaux .......................................................................................................................................... 42
9.2.1. Déclaration typedef ................................................................................................................ 43
9.2.2. Utilisation des tableaux .......................................................................................................... 44
9.3. Chaînes de caractères ...................................................................................................................... 44
9.3.1. Utilisation des chaînes de caractères ..................................................................................... 45
9.3.2. Quelques fonctions des caractères ........................................................................................ 45
9.4. Pointeurs, références ....................................................................................................................... 45
9.4.1. Adresses ................................................................................................................................. 45
9.4.2. Pointeurs ................................................................................................................................ 46
9.4.3. Références .............................................................................................................................. 47
9.5. Pointeurs et tableaux ....................................................................................................................... 47
9.6. Cas des chaînes de caractères .......................................................................................................... 48
9.7. Gestion de la mémoire — variables dynamiques ............................................................................ 48
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 5 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
8. Héritage ......................................................................................................................... 67
8.1. 1er aperçu de l'héritage en C++ ....................................................................................................... 67
8.2. Redéfinition de fonctions membre et de membres .......................................................................... 68
8.3. Appel des constructeurs et destructeurs .......................................................................................... 68
8.4. Constructeur par recopie ................................................................................................................. 70
8.5. Contrôle des accès ........................................................................................................................... 70
8.5.1. « private » et « public » .......................................................................................................... 70
8.5.2. « protected » .......................................................................................................................... 70
8.5.3. Mode de dérivation ................................................................................................................ 72
8.6. L'héritage en général ....................................................................................................................... 72
8.7. Exploitation d'une classe dérivée .................................................................................................... 73
8.8. Compatibilité entre objets d'une classe de base et objets d'une classe dérivée ................................ 73
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 6 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
CONCLUSION............................................................................................................... 98
CHAPITRE III : PROGRAMMATION DES INTERFACES GRAPHIQUES EN C++
AVEC Qt ........................................................................................................................ 99
INTRODUCTION .........................................................................................................100
1. Création d’un projet .....................................................................................................100
2. Structure d’un projet ....................................................................................................102
2.1. Le fichier main.cpp ....................................................................................................................... 102
2.2. Les fichiers mainwindow.cpp et mainwindow.h ........................................................................... 102
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 7 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
CONCLUSION..............................................................................................................111
CONCLUSION GENERALE .........................................................................................112
QUESTIONNAIRE AUX CHOIX MULTIPLES (QCM) ................................................113
QUESTIONS-REPONSES ............................................................................................114
EXERCICES .................................................................................................................115
CORRIGES PROPOSES DES EXERCICES .................................................................119
GLOSSAIRE .................................................................................................................127
BIBLIOGRAPHIE ET WEBOGRAPHIE ......................................................................131
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 8 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
INTRODUCTION GENERALE
Concevoir et développer un logiciel ou une application nécessite la maîtrise d‘un langage
de programmation parmi lesquels l‘on peut citer le langage de programmation C++ qui est un
langage de programmation procédurale et orientée-objet.
C++ est un langage de programmation compilé permettant la programmation sous de
multiples paradigmes (comme la programmation procédurale, orientée objet ou générique).
Ses bonnes performances, et sa compatibilité avec le C en font un des langages de
programmation les plus utilisés dans les applications où la performance est critique. Créé
initialement par Bjarne Stroustrup dans les années 1980, le langage C++ est
aujourd'hui normalisé par l'ISO. Sa première normalisation date de 1998 (ISO/CEI
14882:1998), ensuite amendée par l'erratum technique de 2003 (ISO/CEI 14882:2003). Une
importante mise à jour a été ratifiée et publiée par l'ISO en septembre 2011 sous le nom de
ISO/IEC 14882:2011, ou C++11 Depuis, des mises à jour sont publiées régulièrement : en
2014 (ISO/CEI 14882:2014, ou C++14) puis en 2017 (ISO/CEI 14882:2017, ou C++17).
Ce livre est constitué de trois (3) chapitres. Le premier chapitre intitulé
« PRESENTATION GENERALE DU LANGAGE C++ ET DU PARADIGME P.O.O. »
présente de manière générale le langage C++, son origine et ses évolutions dans sa première
section. La deuxième section aborde le paradigme Orienté Objet (OO). Le deuxième chapitre
intitulé « LES BASES DU LANGAGE C++ ET LA PROGRAMMATION EN MODE
CONSOLE » présente dans la première section tous les concepts de base du langage c++.
Dans la deuxième section, le livre aborde les concepts de la programmation orientée objet
(POO). Dans la troisième section, le livre présente des exemples de création de projets en
mode console. Le troisième chapitre intitulé «PROGRAMMATION DES INTERFACES
GRAPHIQUES EN C++ AVEC Qt » présente la réalisation des applications graphiques en
C++ avec le framework QtCreator de l‘IDE Qt.
En plus des trois chapitres évoqués, le livre comporte également des exercices et corrigés
et un lexique dans le domaine des TIC en général et en particuliers dans les langages de
programmation.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 9 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 10 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
INTRODUCTION
Ce premier chapitre va discuter des généralités et des concepts généraux du langage de
programmation C++. Les caractéristiques du langage C++ sera également présenté dans ledit
chapitre.
1. Qu‘est-ce qu‘un langage ?
Un langage est une faculté de mettre en oeuvre un système de signes permettant la
communication et l'expression de la pensée ou c‘est un ensemble de systèmes d'instructions et
de règles syntaxiques servant à produire des effets prévisibles et de permettre leur
manipulation automatisée.
1.1.Caractéristiques d‘un langage
1.1.1. Expressivité
Un langage doit exprimer la solution dans les termes du problème à résoudre plutôt que
ceux de l'ordinateur sur lequel on code. Un langage peut être très expressif dans certains
domaines et pas dans d'autres. Un langage doit également faciliter la maintenance et
l'évolution du produit.
1.1.2. Simplicité
Un langage doit parvenir à éviter la complexité ou à la gérer correctement. Pas plusieurs
manières de faire les choses.
1.1.3. Implémentation
Un langage doit permettre les points suivants :
Facilité avec laquelle le langage peut être traduit,
Efficacité du code résultant,
Interprétation ou compilation.
1.1.4. Puissance
La puissance d‘un langage se mesure par les différentes possibilités d'actions et le
périmètre d'action.
1.2.Historique générale des langages
Le tableau ci-dessous présente l‘historique de différents langages informatiques.
Tableau 1.1 : Historique des langages informatiques
Prise en Applis Applis
Nom Date Type Paradigmes Lisibilité
main Web GUI
Fortran 1954 Compilé Impératif Moyenne Bonne Possible Non
Cobol 1959 Compilé Impératif Moyenne Moyenne Possible Non
C 1973 Compilé Impératif Longue Moyenne Possible Oui
Impératif,
C++ 1982 Compilé Longue Moyenne Oui Oui
objet
Compilé
Java 1995 Objet Longue Moyenne Oui Oui
(byte code)
C# 2002 Compile Impératif, Longue Moyenne Oui Oui
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 11 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
1.4.Langages objets
La notion du paradigme « objet » a vu le jour dans les années 1960.
60 : Apparition d'un concept de classe dans Simula-67 (Record Class),
70 : Ajout des concepts objets dans Smalltalk 71 (Alan Kay),
80 : Objective C, C++, Eiffel et Common Lisp Obj. System,
90 : Python, Java, Ruby,
2000 : C#, D, ...
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 12 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Le paradigme objet est toujours d'actualité. On considère que sa définition s'est stabilisée
au milieu des années 90.
2. Dénomination
En langage C, ++ est l'opérateur d'incrémentation, c'est-à-dire l'augmentation de la valeur
d'une variable de 1. C'est pourquoi C++ porte ce nom : cela signifie que C++ est un niveau
au-dessus de C. Il existe de nombreuses bibliothèques C++ en plus de la bibliothèque standard
du C++ (C++ Standard Library) qui est incluse dans la norme. Par ailleurs, C++ permet
l'utilisation de l'ensemble des bibliothèques C existantes.
3. Histoire
Bjarne Stroustrup a développé C++ au cours des années 1980, alors qu'il travaillait dans
le laboratoire de recherche Bell d'AT&T. L'idée de créer un nouveau langage venait de
l'expérience en programmation de Stroustrup pour sa thèse de doctorat. Il s'agissait en
l'occurrence d'améliorer le langage C. Il l'avait d'ailleurs nommé C with classes (« C avec des
classes »). Stroustrup trouvait que Simula avait des fonctionnalités très utiles pour le
développement de gros programmes mais qu'il était trop lent pour être utilisé en pratique (cela
était dû à un problème d'implémentation du compilateur Simula), tandis que BCPL était
rapide mais de trop bas niveau et non adapté au développement de gros logiciels. Quand
Stroustrup commença à travailler aux laboratoires Bell, on lui demanda d'analyser
le noyau UNIX en vue de faire du calcul distribué. Se rappelant sa thèse, Stroustrup
commença à améliorer le langage Cavec des fonctionnalités similaires à celle de Simula. C fut
choisi parce qu'il est rapide, portable et d'usage général. En outre, il était une bonne base pour
le principe original et fondateur de C++ : « vous ne payez pas pour ce que vous n'utilisez
pas ». Dès le départ, le langage ajoutait à C la notion de classe (avec encapsulation des
données), de classe dérivée, de vérification des types renforcés (typage fort), d'« inlining », et
d'argument par défaut.
Alors que Stroustrup développait C with classes, il écrivit CFront, un compilateur qui
générait du code source C à partir de code source C with classes. La première
commercialisation se fit en octobre 1985. En 1983, le nom du langage passa de C with
classes à celui de « C++ ». Parmi les nouvelles fonctionnalités qui furent ajoutées au langage,
il y avait les fonctions virtuelles, la surcharge des opérateurs et des fonctions, les références,
les constantes, le contrôle du typage amélioré et les commentaires en fin de ligne. En 1985 fut
publiée la première édition de The C++ Programming Language, apportant ainsi une
référence importante au langage qui n'avait pas encore de standard officiel. En 1989, c'est la
sortie de la version 2.0 de C++. Parmi les nouvelles fonctionnalités, il y avait l'héritage
multiple, les classes abstraites, les fonctions membres statiques, les fonctions membres
constantes, et les membres protégés. En 1990, The Annotated C++ Reference
Manual (« ARM ») fut publié apportant les bases du futur standard. Les ajouts de
fonctionnalités tardifs qu'il comportait couvraient les templates, les exceptions, les espaces de
noms, les nouvelles conversions et le type booléen.
Pendant l'évolution du langage C++, la bibliothèque standard évoluait de concert. Le
premier ajout à la bibliothèque standard du C++ concernait les flux d'entrées/sorties qui
apportaient les fonctionnalités nécessaires au remplacement des fonctions C traditionnelles
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 13 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
telles que printf et scanf. Ensuite, parmi les ajouts les plus importants, il y avait la Standard
Template Library. Après des années de travail, un comité réunissant l'ANSI et
l'ISO standardisa C++ en 1998 (ISO/CEI 14882:1998), l'année où le comité de standardisation
se réunissait à Sophia Antipolis dans le sud de la France. Pendant quelques années après la
sortie officielle du standard, le comité traita des problèmes remontés par les utilisateurs, et
publia en 2003 une version corrigée du standard C++.
Personne ne possède le langage C++. Il est libre de droits ; cependant, le document de
standardisation n'est quant à lui pas disponible gratuitement.
La figure ci-dessous présente l‘inventeur du langage C++.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 14 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 15 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
private, il sera uniquement accessible d'une part, depuis les fonctions qui sont membres
de la classe et, d'autre part, depuis les fonctions autorisées explicitement par la classe
(par l'intermédiaire du mot réservé friend) ;
protected, il aura les mêmes restrictions que s'il était déclaré private, mais il sera en
revanche accessible par les classes filles.
C++ n'impose pas l'encapsulation des membres dans leurs classes. On pourrait donc
déclarer tous les membres publics, mais en perdant une partie des bénéfices apportés par la
programmation orientée objet. Il est de bon usage de déclarer toutes les données privées, ou
au moins protégées, et de rendre publiques les méthodes agissant sur ces données. Ceci
permet de cacher les détails de la mise en œuvre de la classe.
6.1.1. « Hello, world »
Voici l'exemple de Hello world donné dans The C++ Programming Language, Third
Edition de Bjarne Stroustrup :
#include<iostream>
int main()
{
std::cout << "Hello, new world!\n";
}
Dans l'exemple ci-dessus, le code source std::cout << "Hello, new world!\n" envoie la
chaîne de caractères "Hello, new world!\n" à l'objet global cout, défini dans l'espace de noms
standard std, grâce à l'opérateur << de l'objet cout.
6.1.2. Espace de noms
En C++, le mot clef namespace permet de définir et de nommer des espaces de
noms (namespaces), notion déjà présente en langage C ; en effet, le corps d'une routine,
d'une structure de contrôle de flux d'exécution, d'une structure de données ou d'une section de
code (délimitée par les accolades { et }) constitue un espace de noms. En C++, le corps d'une
classe, à l'instar du corps d'une structure de données, constitue aussi un espace de noms.
Dans différents espaces de noms, on peut ainsi définir des entités (routines, variables,
etc.) ayant le même identificateur. L'ambiguïté est résolue en utilisant le nom de l'espace de
nom devant l'opérateur de portée (::) pour indiquer l'espace de noms dans lequel on veut
accéder. Notez que l'espace de noms global du programme n'a pas de nom. Pour accéder à une
entité globale, cachée par une entité locale par exemple, on utilise l'opérateur de portée
précédé d'aucun nom.
6.1.3. Directive using
Il est possible de spécifier un espace de noms précis à utiliser afin d'éviter d'avoir à
recourir à l'opérateur de résolution de portée. Pour cela, le mot-clé using est utilisé avec cette
syntaxe :
using namespace nom_du_namespace;
// ou
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 16 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
using nom_d_un_symbole;
Ainsi, pour utiliser la variable cout définie dans le namespace standard sans utiliser
l'opérateur de résolution de portée, il est possible d'écrire using namespace std; ou using
std::cout;. Cela est valable pour tous les espaces de noms. Cette instruction se place en
général avant le début du code source proprement dit :
#include<iostream>
using namespace std;
int main()
{
cout << "Hello, new world!" << endl;
}
Il est aussi possible, et conseillé, d'importer un symbole particulier, ou de placer cette
instruction dans une fonction afin de limiter la portée :
#include<iostream>
int main()
{
using std::cout;
cout << "Hello, new world!" // std::cout est disponible sans utilisation de std::
<< std::endl; // mais pas std::endl
}
void foo(){
std::cout << "Hello, new world!" ;
// std::cout n'est plus disponible sans utilisation de std:: << std::endl;
}
Le mot-clé using peut aussi être utilisé dans les classes. Si une classe B hérite d'une
classe A, elle peut grâce à ce mot-clé passer des membres protected de A en public dans B,
ou encore démasquer une fonction membre de A qui le serait par une fonction membre de B
de même nom :
#include <cstdlib> //## EXIT_SUCCESS
#include <iostream> //## cout
using namespace std; //## cout
//** ************************************************************
//! Déclaration de la classe de base A.
class A{
protected:
void f();
public:
void g();
};
//** ============================================
//! Définition de la méthode A::f()
void A::f(){
cout << "Methode A::f()\n";
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 17 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
//** ============================================
//! Définition de la méthode A::g()
void A::g(){
cout << "Methode A::g()\n";
}
//** ************************************************************
//! Déclaration de la classe B hérité de A.
class B: public A{
public:
using A::f; // rend public A::f()
};
//** ************************************************************
//! Déclaration de la classe C hérité de A.
class C: public A{
public:
void g(int Val); // masque A::g()
};
//** ============================================
//! Définition de la méthode C::g(int Val)
void C::g(int Val){
cout << "Methode C::g()\n";
}
//** ************************************************************
//! Déclaration de la classe D héritée de A.
class D: public A{
public:
void g(int Val); // masque A::g()
using A::g; // démasque A::g()
};
//** ============================================
//! Définition de la méthode D::g(int Val)
void D::g(int Val){
cout << "Methode D::g(int)\n";
}
//** ************************************************************
int main(){
//! Définition des objets.
A a; B b; C c; D d;
#if 0
a.f(); // impossible car f est protégée dans A
#endif
a.g();
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 18 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
class MessageInternet{
private:
const std::string m_sujet, m_expediteur, m_destinataire; // attributs
public:
MessageInternet(
const std::string& sujet,
const std::string& expediteur,
const std::string& destinataire); // constructeur
~MessageInternet(); // destructeur
const std::string& get_sujet() const; // méthode
const std::string& get_expediteur() const; // méthode
const std::string& get_destinataire() const; // méthode
};
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 19 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
// constructeur
MessageInternet::MessageInternet(
const std::string& sujet,
const std::string& expediteur,
const std::string& destinataire):
m_sujet(sujet), m_expediteur(expediteur), m_destinataire(destinataire)
{
}
// destructeur (pour libérer les ressources acquises ; dans notre cas il n'y a rien à faire)
MessageInternet::~MessageInternet()
{
}
const std::string& MessageInternet::get_sujet() const
{
return m_sujet;
}
const std::string& MessageInternet::get_expediteur() const
{
return m_expediteur;
}
const std::string& MessageInternet::get_destinataire() const
{
return m_destinataire;
}
6.3.Templates
Les templates permettent d'écrire des fonctions et des classes en paramétrant le type de
certains de leurs constituants (type des paramètres ou type de retour pour une fonction, type
des éléments pour une classe collection par exemple). Les templates permettent d'écrire du
code générique, c'est-à-dire qui peut servir pour une famille de fonctions ou de classes qui ne
diffèrent que par le type de leurs constituants.
6.3.1. Paramètres des templates
Les paramètres peuvent être de différentes sortes :
types simples, tels que les classes ou les types élémentaires (int, float, etc.),
tableaux de taille constante, dont la taille, déduite par le compilateur, peut être utilisée
dans l'instanciation du Template,
constantes scalaires, c'est-à-dire de type entier (int, char, bool), mais pas flottant
(float, double) car leur représentation binaire ne fait pas partie de la norme du langage,
templates, dont la définition doit être passée en paramètre, ce qui permet notamment de
s'appuyer sur la définition abstraite, par exemple, d'une collection,
pointeurs ou références, à condition que leur valeur soit définie à l'édition de liens,
méthode d'une classe, dont la signature et la classe doivent être aussi passées en
paramètres,
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 20 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
attribut d'une classe, dont le type et la classe doivent être aussi passés en paramètres.
6.3.2. Utilité des templates
En programmation, il faut parfois écrire de nombreuses versions d'une même fonction ou
classe suivant les types de données manipulées. Par exemple, un tableau de int ou un tableau
de double sont très semblables, et les fonctions de tri ou de recherche dans ces tableaux sont
identiques, la seule différence étant le type des données manipulées. En résumé, l'utilisation
des templates permet de « paramétrer » le type des données manipulées.
Les avantages des templates sont :
des écritures uniques pour les fonctions et les classes,
moins d'erreurs dues à la réécriture.
6.3.3. Exemple de templates
Dans la bibliothèque standard C++, on trouve de nombreux templates. On citera à titre
d'exemple, les entrées/sorties, les chaînes de caractères ou les conteneurs. Les
classes string, istream, ostream et iostream sont toutes des instanciations de type char.
Les fonctions de recherche et de tri sont aussi des templates écrits et utilisables avec de
nombreux types.
#include<string>
// fonction pouvant être appelée avec tous types copiables et ordonnés par l'opérateur <
template<typename T>
T max(T a, T b)
{
return a < b? b: a;
}
int main(){
int i = max(3, 5);
char c = max('e', 'b');
std::string s = max(std::string("hello"), std::string("world"));
float f = max<float>(1, 2.2f); // type paramétré donné explicitement (obligatoire avec ces
paramètres de types différents)
}
Dans la ligne float f = max<float>(1, 2.2f);, on doit explicitement donner le
type float pour le type paramétré T car le compilateur ne déduit pas le type de Tlorsqu'on
passe en même temps un int (1) et un float (2.2f).
6.3.4. Spécialisation des templates
Un template donné peut avoir plusieurs instanciations possibles selon les types donnés en
paramètres. Si un seul paramètre est spécialisé, on parle de spécialisation partielle. Ceci
permet par exemple :
de choisir un type de calcul selon qu'un type est un entier, un flottant, une chaîne de
caractères, etc. Spécialisons l'exemple précédent pour le cas des pointeurs de chaînes de
caractères :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 21 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
template<>
const char* max(const char* a, const char* b)
{
return strcmp(a, b) > 0? a: b;
}
6.3.5. SFINAE
Le mécanisme décrit par l'abréviation SFINAE (Substitution Failure Is Not an Error)
permet de surcharger un template par plusieurs classes (ou fonctions), même si certaines
spécialisations, par exemple, ne peuvent pas être utilisées pour tous les paramètres de
templates. Le compilateur, lors de la substitution, ignore alors les instanciations inapplicables,
au lieu d'émettre une erreur de compilation.
6.4.Polymorphisme et méthodes virtuelles
Le polymorphisme d'inclusion est mis en œuvre à l'aide du mécanisme des méthodes
virtuelles en C++. Une méthode est rendue virtuelle par le placement du mot-
clé virtual devant la déclaration de la méthode dans la classe. Lorsqu'une méthode virtuelle
est appelée, l'implémentation de la méthode exécutée est choisie en fonction du type réel de
l'objet. L'appel n'est donc résolu qu'à l'exécution, le type de l'objet ne pouvant pas a priori être
connu à la compilation.
Le mot-clé virtual indique au compilateur que la méthode déclarée virtuelle est
susceptible d'être redéfinie dans une classe dérivée. Il suffit alors de dériver une classe et de
définir une nouvelle méthode de même signature (même nom, paramètres compatibles — voir
la notion de covariance). Ainsi l'appel de cette méthode sur un objet accédé en tant qu'objet de
la classe de base mais appartenant en réalité à la classe dérivée donnera lieu à l'appel de la
méthode définie dans la classe dérivée.
En particulier, il est obligatoire d'utiliser le mot-clé virtual devant la déclaration du
destructeur de la classe de base lorsque le programme souhaite pouvoir détruire un objet via
un pointeur d'instance de la classe de base au lieu d'un pointeur d'instance de la classe dérivée.
Ce type de polymorphisme (le polymorphisme d'inclusion) est dit dynamique. Le
mécanisme de la surcharge qui est un polymorphisme ad hoc est de type statique. Dans les
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 22 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
deux cas il faut appliquer une logique (par exemple : le nombre et le type des paramètres)
pour résoudre l'appel. Dans le cas de la surcharge, la logique peut être entièrement calculée à
la compilation. Ce calcul permet des optimisations rendant le polymorphisme statique plus
rapide que sa version dynamique. La liaison dynamique de méthodes issues du mécanisme
des méthodes virtuelles induit souvent une table cachée de résolution des appels, la table
virtuelle. Cette table virtuelle augmente le temps nécessaire à l'appel de méthode à l'exécution
par l'ajout d'une indirection supplémentaire.
Le choix entre liaison dynamique et surcharge (polymorphisme dynamique et statique)
est typiquement un problème de calculabilité des appels, ayant souvent pour conséquence
finale un choix entre expressivité et performance.
7. Outils de développement
Un programme C++ peut être produit avec des outils qui automatisent le processus de
construction. Les plus utilisés sont :
make,
Ant (génération portable en XML),
SCons (génération portable en Python),
CMake (génération de Makefile portable).
8. Environnements de développement
Les environnements de développement C++ ou IDE (Integrated Development
Environnement) ou Environnement de Développement Intégré (EDI) sont entre autres :
Anjuta DevStudio,
C++ Builder,
CLion (en),
Code::Blocks (open-source),
Dev-C++ et son extension RAD WxDev-C++,
Eclipse avec le plugin CDT (open-source),
Emacs (libre),
KDevelop,
NetBeans (open-source),
QtCreator (open-source),
Sun Studio,
Vim,
Microsoft Visual C++,
Xcode.
Les environnements de développement utilisés dans ce livre sont le Dev-C++ pour la
programmation en mode console et le QtCreator pour la programmation des interfaces
graphiques.
9. Compilateurs
Le langage C++ dispose de plusieurs compilateurs à savoir :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 23 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 24 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 25 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
INTRODUCTION
Ce chapitre présentera les bases du langage C++. Il sera en effet question dans la
première section de ce chapitre de présenter les différentes syntaxes à savoir la notion de
variables, les types de variables, les mots clés, notion de classes, de méthodes, la syntaxe de
déclarations, les structures conditionnelles, les boucles, etc. Dans la dernière section,
l‘apprenant se familiarisera avec la programmation en mode console. La programmation des
interfaces graphiques sera présentée dans le troisième chapitre du livre. Les outils de
développement utilisés dans ce livre sont : Dev-C++ et le QtCreator.
I. CONCEPTS DE BASE DU LANGAGE C++
1. Mots réservés en C++
Les mots réservés en Java sont entre autres :
Include, define, bool, else, static, friend, operator, try, bool, false, interface, byte, true,
break, while, char, case, new, delete, switch, double, catch, finally, float, class, for,
private, this, int, const, goto, protected, long, continue, if, public, short, default, return,
void, null, do, inline, string, typedef , template, virtual.
Note : Il est interdit d‘utiliser les mots réservés comme identificateurs de variables,
méthodes ou fonctions, fonctions, etc.
2. Variables
2.1.Terminologie
Une variable est caractérisée par :
son nom : mot composé de lettres ou chiffres, commençant par une lettre (le caractère
tient lieu de lettre),
son type précisant la nature de cette variable (nombre entier, caractère, objet etc.),
sa valeur qui peut être modifiée à tout instant.
Durant l‘exécution d‘un programme, à toute variable est attachée une adresse : nombre
entier qui indique où se trouve stockée en mémoire la valeur de cette variable.
2.2.Types de base
2.2.1. Vide
void : Aucune variable ne peut être de ce type. Nous en verrons l‘usage dans les sections
suivantes avec la définition des fonctions.
2.2.2. Entiers
Le type entier par taille-mémoire croissante est le suivant:
Char : Ce type est stocké sur un octet ; valeurs : de −27 à 27 − 1 (−128 à 127),
short: Il est stocké sur 2 octets ; valeurs : de −215 à 215 − 1 (−32768 à 32767),
long : Il est stocké sur 4 octets ; valeurs : de −231 à 231 − 1,
int : Ce type de variable coïncide avec short ou long, selon l‘installation.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 26 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
2.2.3. Réels
Le type réel par taille-mémoire croissante est le suivant:
Float : Ce type est stocké sur 4 octets ; précision : environ 7 chiffres,
double: Ce type est stocké sur 8 octets ; précision : environ 15 chiffres,
long double est stocké sur 10 octets ; précision : environ 18 chiffres.
On trouve parfois le mot unsigned précédant le nom d‘un type entier (on parle alors
d‘entier non signé ; un tel entier est toujours positif).
2.2.4. Booléens
Bool : Une valeur parmi deux possibles, vrai (true) ou faux (false).
2.2.5. Chaînes de caractères
où :
<type> est un nom de type ou de classe,
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 27 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
<liste de variables> est un ou plusieurs noms de variables, s´éparés par des virgules.
Exemples :
int i, j, k; // déclare trois entiers i, j, k
float x, y; // déclare deux réels x, y
2.5.Déclaration + initialisation
En même temps qu‘on déclare une variable, il est possible de lui attribuer une valeur
initiale. On pourra écrire par exemple :
int i, j = 0, k;
float x, y = 1.0;
En particulier, on peut déclarer une constante en ajoutant const devant le nom du type,
par exemple :
const double PI = 3.14159265358979323846;
const int MAX = 100;
Les valeurs des constantes ne peuvent pas être modifiées.
3. Expressions
3.1.Définition
En combinant des noms de variables, des opérateurs, des parenthèses et des appels de
fonctions, on obtient des expressions.
Une règle simple à retenir :
En C++, on appelle expression tout ce qui a une valeur.
3.2.Opérateurs arithmétiques
+ : addition,
- : soustraction,
* : multiplication,
/ : division. Attention : entre deux entiers, donne le quotient entier,
% : entre deux entiers, donne le reste modulo.
Exemples :
19.0 / 5.0 vaut 3.8,
19 / 5 vaut 3,
19 % 5 vaut 4.
Dans les expressions, les règles de priorité sont les règles usuelles des mathématiciens.
Par exemple, l‘expression 5 + 3 * 2 a pour valeur 11 et non 16. En cas de doute, il ne faut pas
hésiter à mettre des parenthèses.
Incrémentation et décrémentation
++ : Incrémentation. Si i est de type entier, les expressions i++ et ++i ont toutes deux
pour valeur la valeur de i. Mais elles ont également un effet de bord qui est :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 28 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Forme générale :
<variable> <opérateur>= < expression> ;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 29 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
3.5.Opérateurs d‘entrées-sorties
Ce sont les opérateurs << et >>, utilisés en conjonction avec des objets prédéfinis cout et
cin déclarés dans <iostream.h> (ne pas oublier la directive #include <iostream.h> en début de
fichier).
Forme :
cout << <expression> : affichage à l‟écran de la valeur de <expression>,
cin >> <variable> : lecture au clavier de la valeur de <variable>
Les quatre manipulateurs ci-dessus, sauf setprecision(), n‘agissent que sur la prochaine
sortie. Pour les utiliser, inclure la librairie <iomanip.h>.
Exemple :
cout << setbase(16) << 256 << endl; // affiche 100 et passe à la ligne
cout << setprecision(5) << setfill(‟*‟) << setw(10) << 123.45678; // affiche ****123.46
4. Instructions
4.1.Instruction-expression
Forme :
<expression>;
Exemple :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 30 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
{
int i = 3, j;
double x = 2.2, y = 3.3;
y = 0.5 * (x + y);
int k = 1 - (j = i);
}
4.3.Structures de contrôle
Ce sont des instructions qui permettent de contrôler le déroulement des opérations
effectuées par le programme : instructions if et switch (branchements conditionnels),
instructions while, do et for (boucles). Se reporter aux paragraphes suivants.
4.4.Visibilité d‘une variable
Le domaine de visibilité d‟une variable est limité au bloc où cette variable est
déclarée, et après sa déclaration.
On dit aussi que les variables déclarées dans un bloc sont locales à ce bloc.
Si une variable est locale `a un bloc B, on ne peut y faire référence en dehors de ce bloc,
mais on peut l‘utiliser à l‘intérieur de B et dans tout bloc inclus lui-même dans B.
Dans un même bloc, il est interdit de déclarer deux variables avec le même nom. Mais
cela est possible dans deux blocs distincts, même si l‘un des blocs est inclus dans l‘autre.
Lorsque dans un fichier, une variable est déclarée en dehors de tout bloc (c‘est-à-dire au
niveau principal), on dit qu‘elle est globale ; elle est alors visible de tout le fichier, à partir de
l‘endroit où elle est déclarée. Cette règle de visibilité s‘appliquera également aux fonctions.
5. Fonctions
5.1.Terminologie
En C++, la partie exécutable d‟un programme (c‟est-à-dire celle qui comporte des
instructions) n‟est composée que de fonctions. Chacune de ces fonctions est destinée à effectuer
une tâche précise et renvoie généralement une valeur, résultat d‟un calcul.
Les trois premiers éléments sont décrits dans la déclaration de la fonction. L‘élément n◦4
figure dans la définition de la fonction.
Toute fonction doit être définie avant d‟être utilisée.
Dans un fichier-source untel.cpp, il est possible d‘utiliser une fonction qui est définie
dans un autre fichier. Mais, pour que la compilation s‘effectue sans encombre, il faut en
principe que cette fonction soit déclarée dans untel.cpp (en usant au besoin de la directive
#include).
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 31 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
La définition d‘une fonction se fait toujours au niveau principal. On ne peut donc pas
imbriquer les fonctions les unes dans les autres, comme on le fait en Pascal.
5.2.Déclaration d‘une fonction
Elle se fait grâce à un prototype de la forme suivante :
<type> <nom>(<liste de paramètres formels>);
où <type> est le type du résultat, <nom> est le nom de la fonction et <liste de paramètres
formels> est composé de zéro, une ou plusieurs déclarations de variables, séparées par des
virgules.
Exemples :
double Moyenne(double x, double y);
char LireCaractere();
void AfficherValeurs(int nombre, double valeur);
Remarque : la dernière fonction n‘est pas destinée à renvoyer une valeur ; c‘est pourquoi le
type du résultat est void (une telle fonction est parfois appelée procédure).
5.3.Définition d‘une fonction
Elle est de la forme suivante :
<type> <nom>(<liste de param`etres formels>)
<instruction-bloc>
Donnons par exemple les définitions des trois fonctions déclarées ci-dessus :
double Moyenne(double x, double y){
return (x + y) / 2.0;
}
char LireCaractere(){
char c;
cin >> c;
return c;
}
void AfficherValeurs(int nombre, double valeur){
cout << ‟\t‟ << nombre << ‟\t‟ << valeur << ‟\n‟;
}
A retenir :
L‟instruction return <expression>; interrompt l‟exécution de la fonction.
La valeur de l‟<expression> est la valeur que renvoie la fonction.
5.4.Utilisation d‘une fonction
Elle se fait grâce à l‘appel de la fonction. Cet appel est une expression de la forme :
<nom_fonction>(<liste d‟expressions>) ;
Mécanisme de l‘appel :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 32 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
5.6.Exemple de programme
Voici un petit programme complet écrit en C++ :
// ------------------- fichier gazole.cpp ---------------------
#include <iostream.h> // pour les entrées-sorties
const double prix_du_litre = 0.89; // déclaration du prix du litre de gazole (en
euros) comme constante (hum!)
int reserve = 10000; // déclaration de la réserve de la pompe, en litres
double prix(int nb) // définition d‟une fonction appelée "prix" :
// cette fonction renvoie le prix de nb litres de gazole
{
return nb * prix_ du_litre;
}
int delivre(int nb) // définition d‟une fonction appelée "delivre": cette fonction
renvoie 0
// si la réserve est insuffisante, 1 sinon et délivre alors nb litres
{
if (nb > reserve) // instruction if : voir la section suivante
return 0;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 33 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
reserve -= nb;
return 1;
}
int main() // définition de la fonction principale
{
int possible;
do // instruction do : voir la section suivante
{
int quantite;
cout << "Bonjour. Combien voulez-vous de litres de gazole ? ";
cin >> quantite;
possible = delivre(quantite);
if (possible)
cout << "Cela fait " << prix(quantite) << " euros.\n";
}
while (possible);
cout << "Plus assez de carburant.\n";
return 0; // la fonction main renvoie traditionnellement un entier
}
Comme le montre le programme précédent, il est tout-à-fait possible de n‘écrire qu‘un
seul fichier-source .cpp contenant toutes les déclarations et instructions. Cependant, pour un
gros programme, il est recommandé d‘écrire plusieurs fichiers-source, chacun étant spécialisé
dans une catégorie d‘actions précise. Cette technique sera d‘ailleurs de rigueur quand nous
ferons de la programmation-objet.
A titre d‘exemple, voici le même programme, mais composé de trois fichiers-sources
distincts. On remarquera que le fichier d‘en-tête est inclus dans les deux autres fichiers (voir
la section suivante) :
// ------------------- fichier pompe.h ----------------------
const double prix du litre = 0.89; // déclaration du prix du litre de gazole (en euros)
double prix(int nb); // déclaration de la fonction prix
int delivre(int nb); // déclaration de la fonction delivre
// ------------------- fichier pompe.cpp --------------------
#include "pompe.h" // pour inclure les déclarations précédentes
int reserve = 10000; // déclaration de la réserve de la pompe, en litres
double prix(int nb) // définition de la fonction prix
{
....... // comme ci-dessus
}
int delivre(int nb) // définition de la fonction delivre
{
....... // comme ci-dessus
}
// ------------------- fichier clients.cpp ------------------
#include <iostream.h> // pour les entrées-sorties
#include "pompe.h" // pour les déclarations communes
int main() // définition de la fonction principale
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 34 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
{
....... // comme ci-dessus
}
Pour échanger les valeurs de x et y, il faut alors écrire echange(&x, &y), c‘est-à-dire
passer à la fonction les adresses de x et y (on parle de passage par adresse).
6. Instructions conditionnelles
6.1.L‘instruction if
Forme :
if (<expression entière>)
<instruction1>
else
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 35 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
<instruction2>
L‘évaluation des expressions booléennes est une évaluation courte. Par exemple,
l‘expression u && v prend la valeur 0 dès que u est évalué à 0, sans que v ne soit évalué.
6.1.2. Opérateurs de comparaison
Les opérateurs de comparaison en C++ sont les suivants :
== : égal,
!= : différent,
< : strictement inférieur,
> : strictement supérieur,
<= : inférieur ou égal,
>= : supérieur ou égal.
Exemple :
On veut définir une fonction calculant le maximum de trois entiers.
Première solution :
int Max(int x, int y, int z) // calcule le maximum de trois entiers
{
if ((x <= z) && (y <= z))
return z;
if ((x <= y) && (z <= y))
return y;
return x;
}
Deuxième solution, avec une fonction auxiliaire calculant le maximum de deux entiers :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 36 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Comme on le voit sur cet exemple, deux fonctions peuvent avoir le même nom, d`es lors
qu‘elles diffèrent par le nombre ou le type des paramètres.
6.2.L‘instruction switch
Cette instruction permet un branchement conditionnel multiple.
Forme :
switch (<expression>){
case <valeur1> :
<instructions>
case <valeur2> :
<instructions>
...
case <valeurn> :
<instructions>
default :
<instructions>
}
Mécanisme :
L‘<expression> est évaluée. S‘il y a un case avec une valeur égale à la valeur de
l‘<expression>, l‘exécution est transférée à la première instruction qui suit ce case ; si un tel
case n‘existe pas, l‘exécution est transférée à la première instruction qui suit default :.
Remarque 1 : La partie default : <instructions> est facultative.
Remarque 2 : L‘instruction switch est en général utilisée en conjonction avec l‘instruction
break; qui permet de sortir immédiatement du switch.
Exemple :
switch (note / 2) // on suppose note entier entre 0 et 20
{
case 10 :
case 9 :
case 8 :
mention = "TB";
break;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 37 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
case 7 :
mention = "B";
break;
case 6 :
mention = "AB";
break;
case 5 :
mention = "P";
break;
default :
mention = "AJOURNE";
}
6.3.Les boucles
6.3.1. L’instruction while
Forme :
while (<expression entière>)
<instruction>
Mécanisme :
L‘<expression entière> est d‘abord évaluée. Tant qu‘elle est vraie (c‘est-à-dire différente
de 0), l‘<instruction> est effectuée.
Schématiquement :
Mécanisme :
L‘<instruction> est effectuée, puis l‘<expression entière> est évaluée. Tant qu‘elle est
vraie (c‘est-à-dire différente de 0), l‘<instruction> est effectuée.
Schématiquement :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 38 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 39 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
}
cout << "La moyenne est " << somme / 10.0;
Fonctionnement :
<expression0> est d‘abord évaluée.
si elle est non nulle, <expression1> est évaluée et donne sa valeur à l‘expression
conditionnelle,
si elle est nulle, <expression2> est évaluée et donne sa valeur à l‘expression
conditionnelle.
Exemple :
int Pgcd(int a, int b) // calcule le pgcd de deux entiers positifs
// variante de (2.7.5) dans le style fonctionnel
{
if (a == b) return a;
return a > b ? Pgcd(a - b, b) : Pgcd(b - a, a);
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 40 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
7. Compléments
Expression virgule
Forme :
<expression1> , <expression2>
Fonctionnement :
<expression1> est évaluée, sa valeur est oubliée
<expression2> est ensuite évaluée et donne sa valeur à l‘expression virgule.
Cette expression n‘est intéressante que si <expression1> a un effet de bord.
8. Fonctions utiles
Nous donnons dans cette section quelques fonctions de la bibliothèque standard.
Fonctions mathématiques : elles sont déclarées dans math.h. Il y a notamment les
fonctions suivantes, de paramètre double et de résultat double :
- floor (resp. ceil) : partie entière par défaut (resp. par excès),
- fabs : valeur absolue,
- sqrt : racine carrée,
- pow : puissance (pow(x,y) renvoie xy),
-exp, log, log10,
- sin, cos, tan, asin, acos, atan, sinh, cosh, tanh : fonctions trigonométriques.
Nombres aléatoires :
Il faut inclure stdlib.h et time.h. Alors :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 41 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
On initialise le générateur de nombres aléatoires (de préférence une seule fois) grâce à
l‘instruction srand((unsigned) time(NULL));
Ensuite, chaque appel de la fonction rand() donne un entier aléatoire compris entre 0
et RAND MAX (constante définie dans stdlib.h).
Effacement de l’écran :
Instruction system("cls"); (la fonction system() est déclarée dans stdlib.h).
Arrêt du programme :
l‘instruction exit(1) provoque l‘arrêt immédiat du programme (la fonction exit() est
déclarée dans stdlib.h).
9. Eléments du langage
9.1.Enumérations
Les énumérations sont des listes de noms représentant les valeurs entières successives 0, 1, 2,
...
Une énumération se définit par un énoncé de la forme :
enum <nom> { <liste de noms> };
Exemples :
enum Jour {dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi};
enum Couleur {coeur, pique, carreau, trefle};
enum Vache {blanchette, noiraude, gertrude};
Le premier énoncé équivaut à la déclaration des constantes entières :
const int dimanche = 0;
const int lundi = 1;
const int mardi = 2;
etc . . .
où :
<type> est le type des éléments du tableau,
<nom> est le nom du tableau,
<taille> est une constante entière égale au nombre d‘éléments du tableau.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 42 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Exemples :
int tab1[2]; // tableau de deux entiers
char mot[10], s[256]; // tableaux de respectivement 10 et 256 caractères
double tab2[3]; // tableau de trois nombres réels
Vache troupeau[1000]; // tableau de mille vaches
Note :
Si t est un tableau et i une expression entière, on note t[i] l‟élément d‟indice i du
tableau. Les éléments d‟un tableau sont indicés de 0 à taille − 1.
Par exemple, le tableau fraction déclaré ci-dessus représente deux variables entières qui
sont fraction[0] et fraction[1]. Ces variables se traitent comme des variables ordinaires ; on
peut par exemple écrire :
fraction[0] = 1;
fraction[1] = 2; etc.
Remarque : Les éléments d‘un tableau sont stockés en mémoire de façon contiguë, dans
l‘ordre des indices.
Il est possible de déclarer des tableaux `a deux indices (ou plus). Par exemple, en écrivant :
int M[2][3];
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 43 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
9.3.Chaînes de caractères
Note :
En C++, une chaîne de caractères n‟est rien d‟autre qu‟un tableau de caractères, avec
un caractère nul ‟\0‟ marquant la fin de la chaîne.
Exemples de déclarations :
char nom[20], prenom[20]; // 19 caractères utiles
char adresse[3][40]; // trois lignes de 39 caractères utiles
char turlu[10] = {‟t‟, ‟u‟, ‟t‟, ‟u‟, ‟\0‟}; // ou : char turlu[10] = "tutu";
Comme il a été dit plus haut, les valeurs explicites de type chaîne de caractères sont
écrites avec des guillemets. Par exemple :
prenom = "Antoine"; //illégal
strcpy(prenom, "Antoine"); // correct : voir ce qui suit
On peut représenter le tableau prenom par le schéma suivant :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 44 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
9.4.Pointeurs, références
9.4.1. Adresses
La mémoire d‘un ordinateur peut être considérée comme un empilement de cases-
mémoire. Chaque case-mémoire est repérée par un numéro qu‘on appelle son adresse (en
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 45 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
général un entier long). Si ma_var est une variable d‘un type quelconque, l‘adresse où est
stockée la valeur de ma_var s‘obtient grâce à l‘opérateur d‘adresse & : cette adresse se note
&ma_var :
9.4.2. Pointeurs
Un pointeur est une variable qui contient l‘adresse d‘une autre variable.
La déclaration d‘un pointeur est de la forme suivante :
<type> *<nom>;
Exemple :
int *p;
La variable p est alors un pointeur sur un int ; la variable entière dont p contient l‘adresse
est dite pointée par p et se note *p.
Schématiquement :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 46 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Remarque : Il y a dans stdlib.h la valeur pointeur NULL (égale à 0) qui est compatible avec
tout type de pointeur. Ainsi :
dp = NULL; // légal
ip = NULL; // légal
9.4.3. Références
Une référence est une variable qui coïncide avec une autre variable.
La déclaration d‘une référence est de la forme suivante :
<type> &<nom> = <nom var>;
Exemple :
int n = 10;
int &r = n; // r est une référence sur n
Cela signifie que r et n représentent la même variable (en particulier, elles ont la même
adresse). Si on écrit par la suite : r = 20, n prend également la valeur 20.
Attention :
double somme, moyenne;
double &total = somme; // correct : total est une référence sur somme
double &valeur; // illégal : pas de variable à laquelle se référer
double &total = moyenne; // illégal : on ne peut redéfinir une référence
9.5.Pointeurs et tableaux
Considérons la déclaration suivante :
int T[5]; // T est un tableau de 5 entiers
T est en réalité un pointeur constant sur un int et contient l‘adresse du premier élément du
tableau. Donc T et &T[0] sont synonymes. On a le droit d‘écrire par exemple :
int *p = T;
p[2]; // = T[2]
A noter :
int U[5];
U = T; // illégal : U ne peut être modifié (pointeur constant)
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 47 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
V[i] = 0;
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 48 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Cette fois, p contient une véritable adresse (ou NULL s‘il n‘y a plus assez de mémoire).
On peut alors utiliser la variable pointée par p (qu‘on nomme variable dynamique par
opposition aux variables ordinaires qualifiées de statiques). Par exemple :
*p = 12; // ou tout autre traitement...
Lorsqu‘on n‘a plus besoin de la variable *p, il faut libérer l‘espace-mémoire qu‘elle
occupe par l‘instruction:
delete p; // delete : opérateur de désallocation mémoire
L‘expression *p est d`es lors illégale, jusqu‘`a une prochaine allocation par : p = new int;
Cas d‘un tableau dynamique, supposons la déclaration suivante :
int *T;
Ici, l‘intérêt est que n peut être n‘importe quelle expression entière, et pas seulement une
constante comme dans la déclaration d‘un tableau statique. La taille du tableau peut donc être
décidée au moment de l‘exécution, en fonction des besoins.
En fin de traitement, la libération de l‘espace-mémoire occupé par T s‘écrit :
delete [] T; // d´esallocation m´emoire d‟un tableau dynamique
A retenir :
Grâce aux pointeurs, on peut manipuler des structures de données dynamiques dont la
taille n‟est déterminée qu‟au moment de l‟exécution.
b. L‘espace-mémoire (nombre d‘octets) occupé par une valeur de type un type est
donné par l‘opérateur sizeof : on écrira sizeof un type ou encore sizeof une expression, où
une expression est une expression de type un type.
NB : Il est très important de très bien connaître le fonctionnement des pointeurs et des
références car l‘intérêt de la programmation objet en C++ repose sur leur utilisation intensive.
Il faut noter que les opérateurs & et * sont inverses l‘un de l‘autre. On a toujours :
*(&x) = x et &(*p) = p
Attention, on ne peut pas déréférencer un pointeur qui ne contient pas une adresse valide.
int * q ;
*q = 7 ; // plantage
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 49 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Ou encore :
// ceci est un commentaire en C++ /* donc ce slash etoile ne sert à rien */
Mais pas :
// ceci est un commentaire en C++ /* donc ce slash étoile ne sert à rien
et cela donne une erreur de compilation si le étoile slash n‟est pas sur la
même ligne */
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 50 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
...
f = 4.0 ; // correct
...
} // fin de la portee de f
...
f = 4.0 ; // incorrect
...
i = 5 ; // correct
...
} // fin de la portee de i
10.3. Passage de paramètres par référence
En C, les arguments sont passés par valeur. Ce qui signifie que les paramètres d‘une
fonction C sont toujours en entrée de la fonction et pas en sortie de la fonction; autrement dit
les paramètres d‘une fonction ne peuvent pas être modifiés par la fonction.
Ci-dessous la fonction echange est censée échanger les valeurs des deux paramètres n et
p. Faisons une étude pratique de cette fonction. Il faut noter que la même fonction a été déjà
présentée dans la section précédente pour illustrer le même concept.
void echange(int a, int b) {
int c = a ;
a=b;
b=c;
}
main() {
int n = 10 ; int p = 20 ;
cout << « avant appel : « << n << « « << p << endl ;
echange(n, p) ;
cout << « après appel : « << n << « « << p << endl ;
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 51 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
On notera qu‘il n‘y a rien d‘extraordinaire. Pascal possède cette propriété de passage de
paramètres par référence et C++ ne fait que combler un manque important du C.
10.4. Arguments par défaut
En C, il est indispensable que l‘appel de la fonction contienne exactement le même
nombre et type d‘arguments que dans la déclaration de la fonction. C++ permet de
s‘affranchir de cette contrainte en permettant l‘usage d‘arguments par défaut.
void f(int, int = 12) ;
main () {
int n = 10 ; int p = 20 ;
f(n, p) ;
f(n) ;
}
void f(int a, int b) {
cout << « premier argument : « << a ;
cout << « second argument : « << b << endl ;
}
Lors d‘une déclaration avec des arguments par défaut, ceux-ci doivent être les derniers de
la liste des arguments.
Le programmeur doit fixer les valeurs par défaut dans la déclaration de la fonction ou
dans la définition.
10.5. Surdéfinition de fonction
On parle de surdéfinition lorsqu‘un symbole prend plusieurs significations différentes.
Ci-dessous le symbole sosie possède deux significations.
void sosie(int) ;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 52 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
void sosie(float) ;
main () {
int n = 10 ; float x = 4.0 ;
sosie(n) ;
sosie(x) ;
}
void sosie(int a) {
cout << « sosie avec INT : « << a << endl ;
}
void sosie(float b) {
cout << « sosie avec FLOAT : « << b << endl ;
}
La sortie de ce programme est :
sosie avec INT : 10
sosie avec FLOAT : 4.0
10.6. Opérateurs new et delete
En C, la gestion dynamique de la mémoire fait appel aux fonctions malloc et free. En
C++, on utilise les fonctions new et delete.
Avec la déclaration :
int * ad ;
En C++ on alloue dynamiquement comme cela :
ad = new int ;
Alors qu‘en C il fallait faire comme ceci :
ad = (int *) malloc (sizeof(int)) ;
Plus généralement, si on a un type donné type, on alloue une variable avec :
new type ;
Ou un tableau de n variables avec :
new type [n] ;
On désalloue dynamiquement de la mémoire (allouée avec new) comme cela :
delete ad;
Plus généralement, on désalloue une variable x (allouée avec new) avec :
delete x;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 53 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Une fonction définie avec le mot-clé inline aura le même avantage qu‘une macro en C, à
savoir un gain de temps d‘exécution et le même inconvénient, à savoir une plus grande place
mémoire occupée par le programme.
Note : L‘avantage des fonctions en ligne est la disparition des effets de bord.
II. PROGRAMMATION ORIENTEE OBJET
1. Classes et objets
Cette deuxième section du deuxième chapitre aborde les caractéristiques de C++ vis-à-vis
de la programmation orientée objet.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 54 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
1.2.Classe
Vue de la programmation objet, une classe est un type structuré de données. Nous
verrons qu‘une classe C++ est le prolongement des structures C (mot-clé struct).
Vue de la modélisation objet, une classe correspond à un concept du domaine modélisé.
Une classe regroupe des objets qui ont des propriétés et des comportements communs. En
C++, pour une classe, on dit aussi une classe.
Exemple de squelette d’une classe en C++ :
class Nom_class {
private:
// Déclaration des attributs et méthodes privés
protected:
// Déclaration des attributs et méthodes protégés
public:
// Déclaration des attributs et méthodes publics
};
1.3.Instance
Pour désigner un objet de la classe, on dit aussi une instance. « instance » est un
anglicisme qui possède une signification proche de celle de « exemple » en français. On dit
souvent qu‘une instance « instancie » une classe. Cela signifie que l‘instance est un exemple
de la classe. En C++, pour désigner une instance on dit plutôt un objet.
1.4.Attribut ou membre
L‘état d‘un objet est l ‗ensemble des valeurs de ses attributs. Un attribut est une propriété
de l‘objet. En C++, on dit membre.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 55 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Le mot-clé class de C++ est une extension du mot-clé ‗struct’ de C et il suit une syntaxe
proche.
Exemple :
class Point {
int x ; // un membre
int y ; // un autre membre
public :
void initialise(int, int) ; // une fonction membre
void deplace(int, int); // encore une fonction membre
void affiche() ; // encore une fonction membre
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 56 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
};
x et y sont des membres de la classe Point.
Initialise, deplace et affiche sont des fonctions membres de la classe Point.
Noter que cet exemple suit le principe d‘encapsulation car, par défaut, les premiers
membres de la classe sont privés (x et y). Les fonctions membres dont la déclaration est
postérieure au mot clé public sont publiques.
3.2.Définition des fonctions membres de la classe
La déclaration d‘une classe doit être suivie de la définition de ses fonctions membres.
Chaque définition d‘une fonction membre suit la syntaxe de la définition d‘une fonction C
avec un nom préfixé par le nom de la classe et quatre points ‗::‘.
Le symbole „::‟ s „appelle l‟opérateur de résolution de portée.
Pour appeler la fonction membre initialise sur l‘objet a, noter qu‘il faut écrire le nom de
l‘objet (a), un point (.) et le nom de la fonction membre (initialise).
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 57 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 58 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 59 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
++ 4
-- 4
-- 1
Remarque : a est détruit à la sortie du programme main et les objets x sont détruits à la sortie
de fct.
4. Régles d'utilisation des fichiers .cpp et .h
Pour pouvoir effectivement réutiliser les classes programmées et les compiler
séparément, il est indispensable de les exploiter proprement et les ranger dans des fichiers qui
portent des noms corrects.
La déclaration d‟une classe Classe doit être mise dans un fichier classe.h
La définition d‟une classe Classe doit être mise dans un fichier classe.cpp
Si l‘on fait une analogie avec la programmation modulaire, (rappel 1 module = 1 interface
visible + 1 corps caché), on peut dire que :
Le fichier .cpp est le corps de la classe.
Le fichier .h est l‟interface de la classe.
Pour l‘instant, retenir qu‘un fichier classe.h possède la structure suivante :
#ifndef CLASSE_H
#define CLASSE_H
#include ... // includes de classes éventuelles
...
class Classe {
...
};
#endif
Et qu‘un fichier classe.cpp possède la structure suivante :
// fichier classe.cpp
#include « classe.h » // include de sa propre classe
#include ... // autres includes optionnels
...
Classe : :Classe(...) { // definition du constructeur
...
}
Classe : :~Classe() { // définition du destructeur
...
}.
.. // autres définitions de fonctions membres
Ces structures de fichiers sont correctes mais incomplètes. Elles seront affinées dans les
sections suivantes.
Elles permettent la réutilisation et la compilation séparée.
Note 1 : #ifndef, #define et #endif dans le .h servent de garde-fou pour que le fichier ne soit
effectivement inclus qu‘une seule fois lors d‘une compilation.
Note 2 : Il faut inclure obligatoirement le classe.h dans le fichier classe.cpp ; les autres sont
optionnels.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 60 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
5. Membres statiques
Avec le qualificatif ‗static’ avant un membre d‘une classe, on peut spécifier qu‘un
membre est commun à tous les objets de la classe.
En modélisation objet, cela correspond aux attributs « de classe ». Un membre sans le
mot-clé static correspond à un attribut « d’instance ».
Class Exemple {
static int a ;
float b ;
public :
Exemple(float) ;
...
};
...
Exemple : :a = 0 ;// définition d‟un membre statique nécessaire
...
Exemple e(1), f(2) ;
...
Dans la classe Exemple, a est un membre statique, b un membre non statique.
Un membre statique doit être défini dans le .cpp tout comme une fonction membre sinon
une erreur sera produite à l‘édition de liens. La définition du membre statique permet son
initialisation. Ici a = 0 ;
e et f sont des objets avec e.b = 1 et f.b = 2
e et f ont le membre a en commun e.a = f.a = 0.
Nous ne les rappellerons pas dans cette section. Pour les apprendre il suffit d‘aller dans la
section « déclaration et utilisation des fonctions » et les différents modes de passage de
paramètres.
La suite de section comprend essentiellement les améliorations propres aux fonctions
membres à savoir:
fonctions membres en ligne,
fonctions membres statiques,
appel des fonctions membres.
6.1.Fonctions membres en ligne
On peut mettre une fonction membre en ligne mais la syntaxe est différente de celle des
fonctions standards.
Au lieu de mettre le mot-clef ― inline‖ devant la définition de la fonction, on écrit le
corps de la fonction au même endroit que sa déclaration dans la classe.
Ci-dessous la fonction membre deplace de la classe Point est normale :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 61 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
class Point { …
void deplace(int, int);
};
void Point::deplace(int dx, int dy) { x += dx; y += dy; };
Ci-dessous elle est inline bien que le mot-clef ne soit pas présent.
class Point { …
void deplace(int dx, int dy) { x += dx; y += dy; };
};
this est utile, par exemple, dans un constructeur (ou un destructeur) pour stocker l‘adresse
de l‘objet construit (ou effacer l‘adresse de l‘objet détruit) d‘un tableau ou liste d‘instances ou
d‘un attribut d‘un autre objet.
this est un paramètre implicite des fonctions membres d'instance. Il faut savoir que le
préprocesseur d‘un compilateur C++ transforme toutes les fonctions membres d‘instance C++
par des fonctions C dont le premier paramètre est l‘adresse de l‘instance.
this n'a évidemment pas de sens dans une fonction membre de classe.
6.3.Appel des fonctions membres
L‘appel d‘une fonction membre peut se faire de plusieurs manières selon que la fonction
est une fonction membre d‘instance ou bien de classe.
Les règles sont les suivantes.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 62 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 63 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Truc::b(); // cas C
Truc t ; t.Truc::b(); // cas E
Truc * pt = &t ; pt ->Truc::b(); // cas F
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 64 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
class Point {
int x ; int y ;
public :
Point(int abs) { x = abs ; y = 0 ; }
...
};
On peut écrire :
point a(3);
a = 3;
Avec la déclaration de la classe suivante :
struct paire { int n ; int p ; } ;
class Point { …
Point(paire q) { x = q.n ; y = q.p; }
};
On peut écrire :
paire s = { 3, 8 } ;
point a(s);
a = s;
7.3.Constructeur par recopie
Cette section reste importante, elle traite du cas où le constructeur d‘une classe possède
un unique paramètre qui est une référence à un objet de la classe. On appelle alors ce
constructeur, le constructeur par recopie. Ce cas est très utilisé en C++ car bien souvent,
dans un programme, on veut dupliquer un objet (afin, par exemple, de travailler sur sa copie et
de garder une sauvegarde). Pour dupliquer l‘objet a dans un objet b, le programmeur écrira
simplement :
Point b = a;
Ou bien :
Point b(a);
On déclare le constructeur par recopie de la manière suivante :
Point (Point &);
Il y a alors 2 cas : soit le programmeur a écrit un constructeur par recopie, soit non.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 65 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 66 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
recopie un à un les cases du tableau de double pointé par a.adr dans les cases du nouveau
tableau pointé par adr. Ce qui fait que a.adr et b.adr pointent vers des tableaux différents et
aucun problème ne pourra survenir lors de la destruction de a ou de b.
7.3.3. Les exceptions
Les instructions
point a = point(1, 5);
ou
point a = b;
peuvent avoir des comportements différents de ceux vus ci-dessus.
point a = point(1, 5); sera traitée comme: point a(1,5); on appelle le
constructeur usuel.
Si l‘opérateur = a été redéfini (cf section redéfinition d‘opérateurs) alors point a = b;
appellera cet opérateur au lieu du constructeur par recopie.
7.3.4. Objets membres
Un membre d‘un objet peut éventuellement être un objet.
class Pointcol {
Point p;
int couleur;
Pointcol(int, int, int);
};
Pointcol::Pointcol (int abs, int ord, int coul) : Point(abs, ord) { … }
Le constructeur de Point est appelé avant celui de Pointcol.
Pour les destructeurs, c‘est l‘ordre inverse.
On peut appeler une méthode de la classe Point :
Pointcol pc (1,2,3) ;
pc.p.affiche() ;
8. Héritage
Le concept d'héritage est fondamental en C++ (et en POO en général). Il permet d‘écrire
un programme concisément et il permet la réutilisation de composants logiciels.
La classe dérivée « hérite » de la classe de base.
8.1.1er aperçu de l'héritage en C++
class Point { public:
int x;
int y;
Point(int a, int b) { x = a; y = b; }; ~Point();
void deplace(int dx, int dy) { x += dx; y += dy; };
void affiche() { cout << "x = " << x << "y = " << y << endl; };
};
class PointCol : public Point {
public:
int couleur;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 67 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 68 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 69 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
++ construc PointCol 1
-- destruc PointCol 1
-- destruc Point 12 25
-- destruc PointCol 1
-- destruc Point 0 0
-- destruc PointCol 1
-- destruc Point 12 0
-- destruc PointCol 1
-- destruc Point 2 3
-- destruc PointCol 3
-- destruc Point 10 15
8.4.Constructeur par recopie
Si la classe dérivée n'a pas de constructeur par recopie, alors appel du constructeur par
défaut (copie des attributs un à un).
Si la classe dérivée a un constructeur par recopie B(B&b), il n'y a pas forcément d'appel
automatique au constructeur par recopie de la classe de base: on peut le spécifier par B ( B &
b ) : A (b) conversion implicite de b en un objet de la classe A.
8.5.Contrôle des accès
8.5.1. « private » et « public »
Une classe dérivée peut accéder aux attributs publics de la classe de base et appeler les
méthodes publiques de la classe de base. Une classe dérivée n'a pas accès aux membres
privés de la classe de base. Un attribut public (resp. privé) est déclaré avec le mot-clé «
public » (resp. « private »).
Exemple :
class Point {
public:
int x;
private :
int y;
public :
Point(int a, int b) { x = a; y = b; }; ~Point();
void deplace(int dx, int dy) { x += dx; y += dy; };
void affiche() { cout << "x = " << x << "y = " << y << endl; };
};
class PointCol : public Point { public:
int couleur;
PointCol(int, int, int); ~Point();
void colore(int c) { couleur = c };
};
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 70 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Exemple :
class Point { int x; int y;
public: Point(int a, int b) { x = a; y = b; }; ~Point();
protected:
void deplace(int dx, int dy) { x += dx; y += dy; };
void affiche() { cout << "x = " << x << "y = " << y << endl; };
};
Intérêt du statut protégé:
Les membres protégés sont comparables à des membres privés pour un utilisateur de la
classe et à des membres publics pour la classe dérivée.
Exemple d’appel
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Point {
public:
int x; int d;
int y;
Point(int a, int b) { x = a; y = b; };
// ~Point();
void deplace(int dx, int dy) { x += dx; y += dy; };
void affiche() { cout << "Les coordonnees actuelles de a sont " << x <<endl<< "Les coordonnees
actuelles de y sont " << y << endl; };
};
class PointCol : public Point {
public:
int couleur;
PointCol(int, int, int);
//~PointCol();
void colore(int c) { couleur = c; };
};
int main() {
int a, b, da,db;
cout<<"Donner le premier point "<<endl;
cin>>a;
cout<<"Donner le deuxieme point "<<endl;
cin>>b;
cout<<"Donner le deplacement du point a "<<endl;
cin>>da;
cout<<"Donner le deplacement du point b "<<endl;
cin>>db;
Point p(a,b);
p.Point::deplace(da,db); // p.deplace(da,db);
p.Point::affiche(); // p.affiche();
return 0;
}
Un exemple d’exécution
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 71 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Ne pas confondre mode de dérivation (private ou public) placé avant les {} et statut de
visibilité d'un membre (private, protected et public) entre {}.
Note: les mots-clés private, protected et public peuvent apparaître autant de fois que l'on
veut dans une déclaration de classe.
8.6.L'héritage en général
Cette section relie le vocabulaire employé en C++ avec celui de l‘orienté objet en
général.
Vocabulaire pour deux classes A et B en relation d‘héritage.
Si B hérite de A on dit aussi :
B est dérivée de A C++ A est la classe de base de B
B est un A Objet
B spécialise A A généralise B
B est une classe fille de A A est la classe mère de B
B est une sous-classe de A A est une super-classe de B
B is a A Anglais
On parle de la relation est-un ou de la relation is-a.
Dans le cas ou plusieurs classes hérite les unes des autres, on parle de taxonomie de
classes ou d’arbre d'héritage.
C est un B D est un B E est un B G est un F B est un A F est un A
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 72 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
8.8.Compatibilité entre objets d'une classe de base et objets d'une classe dérivée
Puisque la relation d‘héritage est une relation forte, on peut se demander si l‘on peut
affecter un objet de la classe de base dans un objet de la classe dérivée ou pas, et inversement.
L‘idée est que tout objet de la classe dérivée est un objet de la classe de base et que C++
fait des conversions implicites de type.
On peut mettre un objet de type dérivé vers un type de base mais pas l‟inverse.
De même :
on peut mettre un pointeur sur objet de type dérivé vers un pointeur sur objet
de type de base et pas l‟inverse.
Evidemment, cette opération peut amener des catastrophes si l‘objet n‘est pas de la classe
dérivée B mais d‘une autre classe dérivée C, complètement différente de la classe B.
Le typage des objets est statique en C++. Cela signifie que le type d‘un objet est connu à
la compilation et ne change plus ensuite.
Point p(3, 5); PointCol pc(8,6,2); Point * pa = &p; PointCol * pb = &pc;
pa->affiche() appellera Point::affiche()
pb->affiche() appellera PointCol::affiche()
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 73 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 74 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Pour une classe comportant au moins une fonction virtuelle, il existe une table des
adresses de ses fonctions membres:
&point::identifie = @1
&point::deplace = @2
&pointcol::identifie = @3
&pointcol::deplace = @1
&point::deplace = &pointcol::deplace
En plus des emplacements mémoires nécessaires à ses membres, tout objet d'une classe
comportant au moins une fonction virtuelle possède un emplacement mémoire pour un
pointeur contenant l'adresse de sa table des adresses des fonctions virtuelles.
A l'exécution le C++ choisit la bonne table.
9.3.Les fonctions virtuelles en général
Les règles suivantes sont liées aux fonctions virtuelles.
1. La redéfinition d'une fonction virtuelle n'est pas obligatoire.
2. Un constructeur ne peut pas être virtuel.
3. Un destructeur peut être virtuel.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 75 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
10. Templates
Les « templates » (signifie « patron » ou « modèle » en anglais) sont des types
paramétrés. On peut définir un template de fonction ou un template de classe.
10.1.Template de fonctions
Supposons que l‘on veuille généraliser la fonction echange qui échange deux entiers int à
d‘autres types de données ou objets.
Le code de la fonction de base est le suivant :
void echange(int & a, int & b) {
int c = a ;
a=b;
b=c;
}
Il faudrait surcharger la fonction échange avec autant de fonctions echange que de types
de données ou d‘objets sur lesquels appliquer la fonction echange.
C++ propose le mécanisme de template de fonctions.
Le programmeur devra écrire comme suit :
template <class T>
void echange(T & a, T & b) {
Tc=a;
a=b;
b=c;
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 76 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
~V() { delete [] v; }
};
Bien sûr, les paramètres des templates de classe doivent être soient des types (au sens
large, c‘est-à-dire des types prédéfini du langage ou des classes définies par le programmeur)
soient des constantes (par exemple n dans l‘exemple ci-dessus).
Les déclarations suivantes sont donc correctes :
V<Truc, 10> y;
V<Bidule, 100> z;
Le programmeur peut imbriquer les templates. S‘il veut définir une classe liste de listes
de Truc, il déclare :
Liste<Liste<Truc>> ll ;
10.3.Généricité et généralisation
Avec des templates, on peut définir des classes Liste<Point> ou Liste<Truc>.
Il suffit d‘avoir un patron de classe Liste :
template <class T>
class Liste { ...
void ajouter(T *);
int enlever(T *);
T * premier();
T * prochain();
...
};
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 77 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 78 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
et sa définition :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 79 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
return *this ;
}
Noter que l‘opérateur = est vu comme une fonction membre de la classe Rationnel dont
le nom est operator=. Cette fonction membre passe ses paramètres (en entrée et en retour) par
référence. Noter que l‘on met const pour que le C++ vérifie que l‘objet r ne soit pas modifié
au cours de la fonction membre. Noter la valeur de retour *this de cet opérateur : on retourne
le déréferencement de this, adresse de l‘objet courant; donc cet opérateur retourne l‘objet
courant.
Sur les exemples suivants, noter la différence entre une initialisation avec un constructeur
par recopie (cf section sur la construction des objets) et une affectation avec la surcharge de
l‘opérateur =.
Rationnel x(22, 7) ; // constructeur défini par l‟utilisateur
Rationnel y(x) ; // constructeur par recopie
Rationnel w ; // constructeur par défaut
w = x ; // affectation
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 80 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Mais cela ne marche pas encore tout à fait car, operator* étant un opérateur non membre,
il n‘a pas accès aux membres num et den (qui sont des membres privés). Pour pallier à cet
inconvénient sans mettre num et den en membres publiques, il faut mettre cet opérateur en
fonction amie de la classe Rationnel avec le mot-clé friend:
class Rationnel {
private :
int den ;
int num ;
public :
friend Rationnel operator*(const Rationnel&, const Rationnel&) ;
...
};
...
Rationnel operator*(Rationnel & x, Rationnel & y) {
Rationnel z(x.num*y .num, x.den*y.den);
return z ;
} // voilà du C++ pur et dur !
Noter que l‘on met const pour éviter une modification des paramètres dans la fonction et
que l‘on met des références pour éviter les recopies inutiles.
Conclusion : Quand la syntaxe d‘un opérateur ne permet pas de le surcharger en fonction
membre de la classe (pour des raisons pas toujours défendables de symétrie), on le surcharge
en fonction amie de la classe. Le programmeur non soucieux de la symétrie peut faire comme
au début de cette section.
12.3.Surcharge d‘opérateurs de flux >> et <<
On souhaite surcharger >> et <<. Au lieu de faire banalement comme cela :
class Rationnel { ...
void imprimer() ;
...
} ; ...
void Rationnel : :imprimer() {
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 81 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Ici le problème de la surcharge des opérateurs de flux est différent de celui des opérateurs
arithmétiques. Les paramètres de retour et le premier paramètre sont des streams et pas des
Rationnel. Il est impossible de les surcharger comme fonctions membres de la classe
Rationnel. Ici, le programmeur est obligé d‘utiliser les fonctions amies.
Pour surcharger l‘opérateur >> on fait comme cela :
friend istream & operator>>(istream &, Rationnel &)
...
istream & operator<<(istream & istr, const Rationnel & x) {
cout << « numerateur ? » ; istr >> x.num ;
cout << « denominateur ? » ; istr >> x.den ;
return istr;
}
cin >> a;
cout << a;
12.4.Surcharge de l‘opérateur d‘appel (), « fonctions objets »
Cette section décrit la redéfinition de l‘opérateur d‘appel operator() et les «fonctions
objets». Une fonction objet est un objet d‘une classe dont l‘opérateur d‘appel operator() est
redéfini.
Soit par exemple, une fonction de comparaison d‘un entier avec un seuil :
static int seuil = 4 ;
boolean f(int v) { return (v<seuil) ; }
En C, si l‘on veut passer cette fonction en paramètre d‘une autre fonction, on passe
généralement un pointeur sur cette fonction. En C++, on définit cette fonction comme un
objet d‘une classe, ici par exemple, la classe Comparaison :
class Comparaison {
private :
int seuil ;
public :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 82 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Comparaison(int s) { seuil = s ; }
boolean operator()(int v) { return (v<seuil) ; }
...
};
Comparaison inferieurAQuatre(4) ; // création de l‟objet fonction
La sortie sera :
yes no no
Pour qu‘une fonction membre machin (char, Point) de la classe Hit soit amie de la classe
Point, on écrira :
class Point { ...
friend Hit::machin(char, Point);
...
};
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 83 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Les fonctions amies sont utilisées mais rarement. Des exemples sont fournis à la section
pour surcharger les opérateurs *, >> ou <<.
14. Entrées sorties « élaborées »
Ce paragraphe traite des entrées sorties de manière plus approfondie. Les entrées sorties
minimales déjà présentées étaient des entrées sorties formattées. Il existe des primitives de
plus bas niveau que >> et << pour faire des entrées sorties élaborées.
Il existe des classes de flux utilisées pour le traitement de flux de haut niveau, qui héritent
de la classe de base ios à savoir:
istream est-un ios
ifstream est-un istream
istrstream est-un istream
ostream est-un ios
ofstream est-un ostream
ostrstream est-un ostream
iostream est-un istream
est-un ostream
fstream est-un iostream
strstream est-un iostream
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 84 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
~ios() ;
...
};
Les constructeurs et destructeurs de ios sont protégés, ce qui signifie que cette classe
n‘est pas instanciable hors de la classe.
Les membres aussi, ils ne sont pas accessibles à un utilisateur hors de la classe.
Un objet flux est une instance d‘une classe dérivée de ios.
Les attributs de ios :
_strbuf relie l‟objet flux à son tampon.
_tie lie un objet d‟entrée (comme cin) à un objet de sortie (comme cout).
_width définit la largeur du champ de sortie
_prec définit le nombre de chiffres après la virgule pour les réels
_fill est le caractère de remplissage utilisé entre la fin de la sortie effective et la
fin du champ de sortie.
_flags et _state sont des chaînes de bits qui contiennent des paramètres booléens.
Pour accéder à ces attributs, ios fournit un ensemble de primitives de lecture publiques :
class ios {
public :
streambuf* rdbuf() const { return _strbuf ; }
ostream* tie() const { return _tie ; }
int width() const { return _width ; }
int precision() const { return _prec ; }
char fill() const { return _fill ; }
long flags() const { return _flags ; }
int rdstate() const { return _state ; }
...
};
Exemple :
main() {
cout << « cout.width() = « << cout.width() << endl ;
cout << « cout.precision() = « << cout.precision() << endl ;
cout << « cout.fill() = [« << cout.fill() << « ] » << endl ;
cout << « cin.flags() = « << oct << cin.flags() << endl ;
cout << « cout.flags() = « << oct << cout.flags() << endl ;
}
Sortie du programme :
cout.width() = 0
cout.precision() = 6
cout.fill() = [ ]
cin.flags() = 20000000001
cout.flags() = 20000000041
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 85 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Sortie :
#####12345
12345
_fill et _width sont changés pour le premier appel à cout << mais ils reprennent leur
valeur par défaut pour le deuxième appel.
14.1.1. Les drapeaux de format de ios
Les drapeaux de format ont l‘effet suivant si positionné :
01 skipws saute les blancs
02 left sortie justifiée à gauche
04 right … droite
010 internal sortie num. justifiée à droite ; signe ou base justifié à gauche
020 dec base 10
040 oct base 8
0100 hex base 16
0200 showbase préfixe avec la base 0 (octal) 0x (hexa)
0400 showpoint réels avec point
01000 uppercase majuscule
02000 showpos entiers positifs avec +
04000 scientific notation scientifique pour réels
010000 fixed notation « fixée » des réels
020000 unitbuf vidage du flux après chaque insertion
040000 stdio vidage de stdio et stderr après chaque insertion
La fonction flags() positionne les drapeaux à de nouvelles valeurs. Mais elle réinitialise
les drapeaux non spécifiés dans l‘appel…
Exemple :
main() {
int n = 234 ;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 86 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Exemple :
main() {
char buffer[80] ;
cin.unsetf(ios : :skipws) ;
cin >> buffer ; cout << « [« << buffer << « ] » << endl ;
cin >> buffer ; cout << « [« << buffer << « ] » << endl ;
cin >> buffer ; cout << « [« << buffer << « ] » << endl ;
int n = 234 ;
cout.setf(ios : :hex | ios : :uppercase | ios : :showbase) ;
cout << n << endl ;
cout.setf(ios : :basefield) ;
cout << n << endl ;
}
Sortie du programme : hello world
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 87 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
[]
[ hello]
[ world]
0XEA
234
14.1.2. La variable d’état de ios
Les variables d‘état de ios sont entre autres :
0 goodbit
01 eofbit
02 failbit
04 badbit
_state est la variable d‘état du flux ; elle est modifiée par une entrée sortie.
On peut lire _state avec rdstate().
Exemple :
main() {
cout << « cin.rdstate() = » << cin.rdstate() << endl ;
int n;
cin >> n ;
cout << « cin.rdstate() = » << cin.rdstate() << endl ;
}
Sortie du programme :
cin.rdstate() = 0
22
cin.rdstate() = 0
Sortie normale du programme :
Exécution normale :
cin.rdstate() = 0
^D
cin.rdstate() = 3
14.2.Les classes istream et ostream
istream définit l‘opérateur de flux >> et cin,
ostream définit l‘opérateur de flux << et cout.
On appelle les entrées sorties faites avec >> ou <<, les entrées sorties formattées car
elles reconnaissent les types de base et les caractères d‘insertion et d‘extraction.
On peut aussi faire des entrées sorties, dites non formattées, avec d‘autres fonctions
membres de la classe istream ou ostream :
Fonctions d‘entrée non formattées
14.2.1. Lecture de caractères avec cin.get()
Exemple :
main() {
char c ;
while ((c=cin.get()) != EOF)
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 88 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
cout << c ;
cout << endl ;
}
Chaque appel à cin.get() lit un caractère et cout << l‘insère dans la sortie. Ces caractères
sont stockés dans le tampon. Celui-ci est vidé à chaque fin de ligne.
^D termine la boucle.
Il existe une autre fonction get dans cin :
istream& get (char& c) ;
Elle renvoie « faux » lorsqu‘elle détecte une fin de fichier.
Exemple :
main() {
char c ;
while (cin.get(c))
cout << c ;
cout << endl ;
}
Exemple de sortie du programme :
c‟est encore moins bien de repeter
c‟est encore moins bien de repeter
quatre fois la meme chose
quatre fois la meme chose
^D
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 89 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Exemple :
istream& ignore(int n= 1, int delim = EOF) ;
main() {
int jour, an ;
cout << « entrez la date (jj/mm/aa) : « ;
cin >> jour ;
cin.ignore() ;
cin.ignore(80, „/‟) ;
cin >> an ;
cout << » jour = « << jour « << « , an = 19« << an << endl ;
}
Exemple de sortie du programme :
Entrez la date (jj/mm/aa) : 26/2/98
Jour = 28, an 1998
Il existe encore d‘autres fonctions sur cin à savoir :
peek()
putback()
read()
14.2.2. Fonctions de sortie non formatées
Dans ostream, sont définies des fonctions de sortie non formatées.
La fonction put est surdéfinie :
int put(char c) ;
ostream& put(char c) ;
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 90 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
exit(1) ;
}
char id[9], nom[16] ;
int note ;
cout << « \t1 : « ;
int n = 1 ;
while (cin >> id >> nom >> note) {
fichierSortie << nom << « « << id << « « << note << endl ;
cout << « \t » << ++n << «: « ;
}
fichierSortie.close() ;
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 91 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 92 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 93 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 94 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Dans cet exemple, nous choisissons le Bureau et nous créons un dossier « Hello » dans
lequel nous stockons notre projet.
Ce qui donne la figure ci-dessous.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 95 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
/* run this program using the console pauser or add your own getch, system("pause") or
input loop */
return 0;
}
Il faut également noter que l‘on peut supprimer les paramètres de la fonction « main() ».
Le lancement de la compilation donne la figure ci-dessous :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 96 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
/* run this program using the console pauser or add your own getch,
system("pause") or input loop */
int main() {
cout<<"Salut, nous allons faire la somme de deux nombres dans "<<
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 97 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
"ce programme"<<endl;
int a, b;
int somme;
cout<<"Veuillez donner le premier nombre"<<endl;
cin>>a;
cout<<"Veuillez donner le deuxieme nombre"<<endl;
cin>>b;
somme=a+b;
cout<<"La somme de "<<a<<" et "<<b<<" est "<<somme<<endl;
return 34;
}
Note : La valeur de retour de main (return) est de 34. En effet, si le programme a bien
compilé et exécuté, la valeur numérique qui suit le return sera renvoyée sinon, le programme
renvoie un code d‘erreur.
Cout et cin permettent respectivement de faire l‘affichage à la console et la saisie au
clavier.
La compilation et l‘exécution du programme donne ce qui suit :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 98 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 99 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
INTRODUCTION
Ce troisième chapitre du livre va présenter le développement des interfaces graphiques en
C++ avec l‘IDE Qt en utilisant le framework QtCreator.
Cette partie du document ne constitue pas un cours complet sur Qt ni un cours sur
QtCreator. Il s‘agit une introduction rapide permettant à un programmeur C++ n‘ayant jamais
manipulé Qt de faire en quelques minutes un programme avec une interface graphique.
1. Création d‘un projet
Une fois installé, en utilisant l‘icône QtCreator, l‘on peut lancer l‘application et procéder à
la création d‘un projet de type GUI comme l‘indique la figure ci-dessous (Figure : 3.2).
Cliquer sur le bouton ‗Nouveau projet‘ indiqué par la flèche ci-dessous.
Il s‘en suit une succession d‘écrans vous permettant alors de créer un projet. Dans un
premier temps, il suffit de choisir un nom de projet et de choisir un répertoire de travail.
Attention, ne mettez qu‘un seul projet par répertoire car un projet se compose d‘un ensemble
de fichiers et il est important d‘éviter les conflits.
La figure ci-dessous présente l‘interface d‘accueil en vue de la création d‘un projet.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 100 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 101 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 102 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 103 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 104 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 105 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 106 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 107 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Ici, l‘on n‘utilise pas les types de données du C++ standard, il faut prendre soin
d‘utiliser les types spéciaux Qt dont en particulier le type QString et non pas le type string
classique de C++.
Le résultat à l‘exécution du programme est illustré par la figure ci-dessous.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 108 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 109 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 110 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
CONCLUSION
Les applications commercialisables sont dans la plupart du temps graphique. Pour
concevoir et réaliser une application graphique dans un langage donné, il utiliser un IDE
(Integrated Development Environnement) approprié. C‘est e effet l‘objectif de ce troisième
chapitre qui a présenté des exemples de création de projets C++ avec le framework Qt. Il a été
présenté également l‘ossature d‘un projet C++ avec Qt et le contenu du dossier du projet après
compilation et exécution.
QtCreator nous simplifie le processus de compilation, qui est habituellement un peu
délicat avec Qt. Tous les éléments d'une fenêtre sont appelés widgets. Les widgets sont
représentés par des objets dans le code. Ainsi, QPushButton correspond par exemple à un
bouton. Lorsque vous diffusez un programme créé avec Qt, pensez à joindre les fichiers DLL
de Qt pour qu'il puisse fonctionner.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 111 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
CONCLUSION GENERALE
Ce livre s‘adresse aux professionnels en activités, aux chefs d‘entreprise, aux étudiants et
à toute personne désireuse d‘apprendre le langage de programmation orientée-objet (P.O.O)
C++, dans le but de pouvoir mettre en place des applications professionnelles, dynamiques et
de bonne qualité.
Pour bien présenter le contour du langage, ledit livre est constitué de trois (3) chapitres.
Le premier chapitre intitulé « PRESENTATION GENERALE DU LANGAGE C++ ET DU
PARADIGME P.O.O. » présente de manière générale le langage C++, son origine et son
évolution dans sa première section. La deuxième section aborde le paradigme Orienté Objet
(OO). Le deuxième chapitre qui s‘intitule « LES BASES DU LANGAGE C++ ET LA
PROGRAMMATION EN MODE CONSOLE » présente dans la première section tous les
concepts de base du langage C++. Dans la deuxième section, le livre aborde les concepts de la
programmation orientée objet (POO). Dans la troisième section, le livre présente des
exemples de création de projets en mode console. Le troisième chapitre intitulé
«PROGRAMMATION DES INTERFACES GRAPHIQUES EN C++ AVEC Qt » présente la
réalisation des applications graphiques en C++ avec le framework QtCreator de l‘IDE Qt.
En plus des trois chapitres évoqués, le livre comporte également des exercices et corrigés
et un lexique dans le domaine des TIC en général et en particuliers dans le domaine des
langages de programmation.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 112 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
a. 25 caractères,
b. 26 caractères,
c. 24 caractères,
d. Toutes les propositions sont fausses.
7. Que fait la fonction strlen(s) sur la chaîne s?
a. Elle retourne la sous-chaîne de s,
b. Elle retourne la longueur de s,
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 113 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 114 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
EXERCICES
EXERCICE 1 : Questions de cours
1. Donner huit (8) types de variables vues en C++.
2. Donner deux syntaxes de déclaration et d‘initialisation d‘une variable en C++.
3. Expliquer le rôle de la méthode main() dans un programme C++.
4. Rappeler l‘opérateur qui permet de faire une affectation d‘une valeur à une variable en
C++. Donner un exemple dans lequel l‘on affecte la valeur 2 à une variable nommée «
maVariable » de type int.
5. Rappeler deux (2) outils d‘un développeur C++.
6. A quoi sert la bibliothèque « cmath » en C++ ?
7. Donner l‘en-tête de la méthode « main » en C++.
EXERCICE 2
Ecrire un programme en C++ qui calcule le périmètre d‘un cercle. Le programme devra
demander la saisie de toutes les entrées.
EXERCICE 3
Ecrire un programme en C++ qui demande à l‘utilisateur la saisie de deux entiers a et b,
calcule et affiche leur somme, produit et différence.
EXERCICE 4
Ecrire un programme en C++ qui affiche dans la console « Bonjour le monde !! ».
EXERCICE 5
Ecrire un programme en mode console en C++ qui multiplie un tableau (une matrice) de
valeurs saisies par l‘utilisateur par un scalaire (multiplicateur x) et affiche les deux tableaux
(matrices).
Exemple d‘affichage (Les valeurs du tableau et le multiplicateur sont à saisir par l‘utilisateur)
EXERCICE 6
Ecrire un programme en C++ qui demande à l‘utilisateur de saisir un nombre entier N et le
programme retourne un triangle isocèle constitué d‘un caractère qui sera définit dans le
programme ou saisi lors de l‘exécution.
Le symbole de dessin du triangle est à choisir par le programmeur.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 115 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Exemples d‘affichage pour la valeur de N=20 pour deux symboles différents (* et 9).
EXERCICE 7
Ecrire un programme en mode console en C++ qui vérifie si un verbe saisi par un utilisateur
est du premier groupe ou non.
Si le verbe saisi n‘est pas du premier groupe, le programme renvoie le message ‗Le verbe
saisi n‘est pas un verbe du premier groupe‘,
Dans le cas contraire, le programme retourne la conjugaison au présent du verbe saisi.
Exemple d‘exécution du programme (Ici le verbe ‗programmer‘)
EXERCICE 8
Ecrire un programme en mode console en C++ qui demande :
la saisie des dimensions (L : ligne et C : colonne) d‘un tableau à deux dimensions,
la saisie des valeurs de ce tableau à deux dimensions,
Affiche le tableau saisi puis
Le transforme et l‘affiche sous forme d‘un tableau à une dimension.
Exemple d‘exécution du programme (Ici L=4 et C=2)
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 116 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
EXERCICE 9
Ecrire un programme en C qui calcule le factoriel d‘un nombre entier N saisi au clavier.
EXERCICE 10
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 117 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
EXERCICE 16
Ecrire un programme en Java permettant la résolution de l‘équation du premier degré
suivante : aX + b = 0.
EXERCICE 17
Ecrire un programme en Java qui permet de résoudre l‘équation du second degré suivante :
aX2 + bX + C = 0
EXERCICE 18
Ecrire un programme en Java qui demande à l‘utilisateur de saisir au clavier un nombre. Le
programme calcule et affiche le cumul et s‘arrête si l‘utilisateur saisit un nombre négatif.
Sinon, le programme demande la saisie du nombre suivant.
EXERCICE 19
Ecrire un programme en Java qui demande à l‘utilisateur la saisie d‘un nombre appelé
« valLimite », et ensuite demande la saisie des « valLimite » nombres réels et calcul leur
somme ou leur produit.
EXERCICE 20
Ecrire un programme en Java qui demande à l‘utilisateur de saisir les notes (5 notes) d‘un
étudiant et calcule puis affiche sa moyenne.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 118 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
4. Rappeler l‟opérateur qui permet de faire une affectation d‟une valeur à une variable en
C++. Donner un exemple dans lequel l‟on affecte la valeur 2 à une variable nommée «
maVariable » de type int.
Réponse :
=;
Int maVariable=2 ;
5. Rappeler deux (2) outils d‟un développeur C++
Réponse :
Dev-C++, Qt (QtCreator).
//Instruction
Return 0 ;
}
Réponse EXERCICE 2
Ecrire un programme en C++ qui calcule le périmètre d‟un cercle. Le programme devra
demander la saisie de toutes les entrées.
Réponse :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 119 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
package exemple.toto.com;
#include <iostream>
#include<conio.h>
#include<cstdlib>
using namespace std;
int main() {
double perimetre, diametre;
const double pi=3,14 ;
cout<<"Veuillez donner le diametre"<<endl;
cin>>diametre ;
perimetre=diametre*pi ;
cout<<"Le perimetre est : "<<perimetre<<endl;
return 0;
}
Réponse EXERCICE 3
Ecrire un programme en C++ qui demande la saisie de deux nombres entiers a et b, calcule
et affiche leur somme, produit et différence.
Réponse :
package exemple.toto.com;
#include <iostream>
Ecrire un programme en C++ qui affiche dans la console «Bonjour le monde !!».
Réponse :
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 120 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
package java.test.com;
#include <iostream>
Réponse EXERCICE 5
Ecrire un programme en mode console en C++ qui multiplie un tableau (une matrice) de
valeurs saisies par l‟utilisateur par un scalaire (multiplicateur x) et affiche les deux tableaux
(matrices).
#include <iostream>
#include<string.h>
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 121 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Réponse EXERCICE 6
#include <iostream>
#include<string.h>
for(i=0;i<N;i++){
for(j=0;j<N-(i+1);j++)
cout<<" ";
for(j=0;j<2*i+1;j++)
cout<<c<<endl;
// printf("\n");
}
return 0;
}
Réponse EXERCICE 7
Ecrire un programme en mode console en C++ qui vérifie si un verbe saisi par un utilisateur
est du premier groupe ou non.
Si le verbe saisi n‟est pas du premier groupe, le programme renvoie le message „Le verbe
saisi n‟est pas un verbe du premier groupe‟,
Dans le cas contraire, le programme retourne la conjugaison au présent du verbe saisi.
Réponse :
#include <iostream>
#include<string.h>
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 122 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
int main(){
/*déclaration*/
char verb[20];
/*chaine contenant le verbe*/
char affi[30];
/*chaine pour l'affichage*/
int L;
/*longueur de la chaine*/
/*saisie des donnees*/
cout<<"verbe"<<endl;
cin>>verb;
/*controler s'il s'agit d'un verbe en 'er'* et abstraction au verbe aller*/
L=strlen(verb);
if((verb[L-2]!='e')||(verb[L-1]!='r')|| strcmp("aller", verb)==0)
puts("\a Ce n'est pas un verbe du premier groupe!!!!!!!!!!");
else{
/*couper la terminaison 'er'*/
verb[L-2]='\0';
/*conjuguaisoné*/
affi[0]='\0';
strcat(affi,"je ");
strcat(affi,verb);
strcat(affi,"e");
cout<<affi<<endl;
affi[0]='\0';
strcat(affi,"Tu ");
strcat(affi,verb);
strcat(affi,"es");
puts(affi);
affi[0]='\0';
strcat(affi,"Il ");
strcat(affi,verb);
strcat(affi,"e");
puts(affi);
affi[0]='\0';
strcat(affi,"Nous ");
strcat(affi,verb);
strcat(affi,"ons");
puts(affi);
affi[0]='\0';
strcat(affi,"Vous ");
strcat(affi,verb);
strcat(affi,"ez");
puts(affi);
affi[0]='\0';
strcat(affi,"ils ");
strcat(affi,verb);
strcat(affi,"ent");
puts(affi);
}
return 0;
}
Réponse EXERCICE 8
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 123 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Réponse EXERCICE 9
Ecrire une fonction en C qui calcule le factoriel d‟un nombre entier N positif saisi au clavier.
Réponse :
package java.test.com;
#include<iostream>
using namespace std;
int fact(int N){
if(N==1)
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 124 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
return 1;
return fact(N-1)*N;
}
int main(){
int N, P;
do{
cout<<"Donner N"<<endl;
cin>>N;
}
while(N<0);
P=fact(N-1)*N;
cout<<"P= "<<P<<endl;
return 0;
}
Réponse EXERCICE 10
Réponse :
Ecrire un programme en mode console en C qui calcule le nombre d‟années pendant
lequel l‟on deviendra 100 millionnaire s‟il dépose chaque année une somme constante dont il
faut saisir au clavier.
Note : Le taux d‟intérêt est fixé à 3,5%,
Le programme devra afficher le nombre d‟années, le solde total en F CFA et le taux d‟intérêt
saisi.
#include <iostream>
#include<conio.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input
loop */
/*Exercice: En combien d'années un homme deviendra-t-il millionnaire s'il investit chaque
année 200.000 F CFA dans une banque à un taux de 3,5% ?*/
int main() {
int nbran=0;
double tva,nouvomontant,ancienmontant=0.0;
// for(int i=0;i<5;i++){
cout<<"Donnee le nouveau montant"<<endl;
cin>>nouvomontant;
cout<<"Donnee la tva"<<endl;
cin>>tva;
while(ancienmontant<100000000){
// montant=(1+tva)*montant;
ancienmontant=(1+tva)*ancienmontant +nouvomontant;
nbran=nbran+1;
}
cout<<"Le nombre des annees pour devenir millionnaire est de: "<<nbran<<" ans"<<endl;
cout<<"Le montant pendant: "<<nbran<<" ans est: "<<ancienmontant<<" F CFA"<<endl<<endl;
// i++}
return 0;
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 125 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Réponse EXERCICE 11
Ecrire un programme en C qui calcule le PGCD (Plus Grand Commun Diviseur) de deux
nombre saisis au clavier
Réponse (Proposition en C très proche du C++)
#include<stdio.h>
#include<conio.h>
main(){
int A,B;
int reste,a,b;
do{
printf("Donner A\n");
scanf("%d",&A);
}
while(!A);
do{
printf("Donner B\n");
scanf("%d",&B);
}
while(!B);
for(a=A,reste=A,b=B;reste;a=b,b=reste)
reste=a%b;
printf("Le PGCD de %d et %d est %d",A,B,a);
getch();
}
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 126 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
GLOSSAIRE
A P
abstract: signifie qu‘il n‘y a pas d‘implémentation. package: regroupement de diverses classes.
ANSI: American National Standard Institute.
PHP (Hypertext Preprocessor) : Plus connu sous
ARM : The Annotated C++ Reference Manual fut son sigle PHP (acronyme récursif), est un langage
publié en 1990, apportant les bases du futur de programmation libre, principalement utilisé pour
standard.
produire des pages Web dynamiques via un serveur
Attribut : Peut être une variable ou une colonne HTTP, mais pouvant également fonctionner comme
d‘une relation, caractérisée par un nom. n'importe quel langage interprété de façon locale.
B PHP est un langage impératif orienté objet. Ledit
langage a permis de créer un grand nombre de sites
Base de données (BD ou BDD) : Une base de
web célèbres, comme Facebook, Wikipédia, etc. Il
données est un ensemble de tables, ayant pour but
est considéré comme une des bases de la création de
d‘exploiter des informations de façon conviviale et
sites web dits dynamiques mais également des
rapide ou ensemble de données (de l‘organisation)
applications web.
structurées et liées entre elles.
PL/SQL: Procedural Language / Structured Query
stocké sur support à accès direct (disque), Language. Le langage de requête propre au SGBD
géré par un SGBD (Système de Gestion de Bases Oracle.
de Données),
P.O.O: Programmation Orientée Objet, il s‘agit
accessible par un ensemble d'applications.
d‘un paradigme dans le concept de la
C programmation, opposé à la programmation
Clé artificielle : En opposition à une clé naturelle, procédurale ou fonctionnelle.
dans le domaine des bases de données, aussi parfois Private (modificateur): Qualifie un attribut ou un
appelée clé de remplacement (de l'anglais surrogate membre ou fonction membre non accessible de
key) désigne un ensemble de données adjointes aux l‘extérieur par rapport à la classe dans laquelle
données d'une table pour les indexer. il/elle est déclaré (e).
Clé candidate : C‘est un ensemble des données Projection : On ne sélectionne qu‘un ou plusieurs
permettant d'indexer chaque ligne d'une table donnée attributs d‘une relation (on ignore les autres). Par
de manière différenciée. Une même table peut exemple n‘afficher que les colonnes nom et prénom
posséder plusieurs clés candidates distinctes. Une de la table Personnes.
table avec des lignes en doublon ne possède aucune
Propriété : Colonne ou champ d‘une table (voir
clé candidate.
attribut).
Clé étrangère : Dans une base de données
Public (modificateur): Qualifie un attribut ou un
relationnelle, est une contrainte qui garantit l'intégrité
membre ou fonction membre accessible de
référentielle entre deux tables.
l‘extérieur par rapport à la classe dans laquelle
Clé naturelle : C‘est une clé choisie parmi les clés il/elle est déclaré (e).
candidates pour indexer une base.
R
Clé primaire : La clé primaire est un identifiant (ou
Requête : Une requête est composée d‘une ou de
champ ou groupe de champs) qui permet d‘identifier
plusieurs tables permettant de visualiser ou
ou d‘indexer de manière unique un enregistrement ou
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 127 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
une entrée d‘une table. La clé primaire appartient d‘afficher, d‘insérer, de modifier ou de supprimer
nécessairement à l'ensemble des clés candidates. les données dans les tables de la base de données.
CRUD : Create Read Update et Delete (ou Destroy), Une requête est en effet une interrogation adressée
constitue les quatre principales opérations à au serveur de bases de données.
implémenter lors du développement d‘une Requête de Création de table (CREATE
application ou d‘un logiciel. TABLE): Cette requête crée une table à partir des
données qu'elle a extraites dans une ou plusieurs
D
autres tables.
Domaine : Ensemble des valeurs d‘un attribut.
Requête d’Insertion (INSERT) : Cette requête
Enregistrement ou entrée : Voir tuple. permet d‘insérer ou d‘ajouter des lignes ou
G enregistrements dans une table.
GUI : Graphical User Interface, interface graphique Requête de Mise à Jour (UPDATE) : Cette
utilisateur. requête modifie le contenu d'un ou plusieurs champs
d'une ou plusieurs tables. C'est le moyen le plus
GCJ : GNU Compiler for Java est un compilateur
Java qui compile le Java en code natif pour la efficace pour mettre à jour un grand nombre
machine cible. d'enregistrements en une seule opération.
H Requête de Sélection (SELECT) : C'est celle qu'on
utilisera le plus souvent. Elle permet de sélectionner
HTML (HyperText Markup Language) : C‘est le
des enregistrements, de faire des calculs et des
langage de description des pages web.
regroupements. Elles ressemblent beaucoup aux
HTTP (HyperText Transfer Protocol) : C‘est le filtres, mais permettent, en plus, de travailler sur
protocole d‘échange de données entre un client (un plusieurs tables simultanément.
ordinateur d‘un utilisateur) et un serveur web (un
Requête de Suppression (DELETE) : Cette
ordinateur sur lequel est placé (hébergé) la page ou
requête supprime un ou plusieurs enregistrements
site web).
dans une ou plusieurs tables.
I
Requête Suppression des objets (DROP) : Cette
IDE: Integrated Development Environment, pour requête permet de supprimer des objets (table, vue,
environnement de développement intégré en français synonymes, etc.) de la base de données.
est un outil logiciel qui offre la possibilité d‘écrire le
RMI: Java Remote Invocation.
code, de compiler et d‘exécuter un programme écrit
dans un langage donnée. Donc il s‘agit d‘un RTTI : Run-Time Type Information, l'identification
environnement qui regroupe trois (3) fonctions (3 in de type pendant l'exécution. Il s‘agit de l‘une des
1). nouvelles fonctionnalités ajoutées dans le langage
C++ par rapport au langage C.
J
S
JCE : Java Cryptography Extension.
SDK: Software development Kit, c‘est un ensemble
JCP : Java Community Process.
des outils de développement Java plus le JRE.
JDBC : Java DataBase Connectivity constitue l‘une
Sélection : On sélectionne tous les tuples ou bien
des API de persistance en Java. Offre des possibilités
seulement une partie en fonction de critères de
de connexion aux bases de données.
sélection qui portent sur les valeurs des attributs.
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 128 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
JDK : Java Development Kit ou le kit de Par exemple n‘afficher que les lignes de la table
développement Java. Personnes qui vérifient la condition suivante : le
nom ne commence pas par la lettre ‗C‘. Cette
JLS : Java Language Specification.
algèbre est facilement possible avec les commandes
JRE : Java Runtime Environement, environnement de MySQL (ou SQL) (SELECT… FROM…
d‘exécution de programme Java. WHERE…).
JSR : Java Specifications Requests, permet de SGBD : Système de Gestion des Bases de Données.
proposer des ajouts et des changements sur la plate- Il s‘agit d‘un logiciel ou application permettant la
forme Java. création, la gestion et la facilitation d‘accès aux
JVM : Java Virtual Machine, machine virtuelle Java. bases de données. Exemple de SGBD : Oracle,
MySQL, SQL Server, etc.
L
SQL : Structured Query Language / Langage de
LCD : Langage de Contrôle de Données, sous-
requêtes structurées. Ce langage permet d‘interagir
langage SQL qui définit les droits et les rôles d‘accès
avec la base de données en y ajoutant, supprimant,
aux données dans la base de données.
modifiant et en affichant le contenu des tables.
LDD : Langage de Définition des données, l‘un des
STL : Standard Template Library est une sous-
sous-langages SQL qui permet de définir les objets
bibliothèque de la bibliothèque standard en C qui
de la base de données.
met à la disposition du programmeur des outils
LID : Langage d‘Interrogation des Données, sous- puissants comme les collections (conteneurs) et les
langage SQL pour l‘interrogation des données itérateurs.
(tables, …).
T
LMD : Langage de Manipulation des Données, sous- Tables : Une table est une structure que l‘on définit
langage SQL qui propose des ordres pour la afin de recevoir des informations traitant d‘un même
manipulation des données dans la base de données. sujet. Composée de champs, elle définit les règles
M de validation de ceux-ci. A l‘utilisation, elle
contiendra les données rentrées relatives à la table.
MAMP (Mac OS Apache MySQL PHP) : C‘est un
serveur encore appelé MampServer qui intègre le TCP/IP (Transmission Control Protocol/Internet
serveur de base de données MySQL. Il est édité pour Protocol): Protocole de transport des couches 3 et 4
tourner sur les systèmes d‘exploitation Macintosh. du modèle OSI.
MySQL: My SQL (Structured Query Language). TIC : Technologies de l‘Information et de la
communication.
N
NTIC : Nouvelles Technologies de l‘Information et V
de la Communication. VM : Virtual Machine, machine virtuelle en
français.
O
W
OMG : Objet Management Group.
WORA: Write Once, Run Anywhere (écrit une
Oracle : Oracle est un SGBD commercial qui
fois, exécuté partout).
occupe le premier rang dans le classement mondial
de 2017. X
OS : Operating System (SE : Système d‘Exploitation
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 129 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 130 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
BIBLIOGRAPHIE ET WEBOGRAPHIE
[Deitel et Deitel 2011] (en) P. Deitel, C++ How to program, 20 Hall, 2011, 8e éd.,
1104 p. (ISBN 978-0-132-66236-9).
[Dawson 2010] (en) M. Dawson, Beginning C++ Through Game Programming, Course
Technology PTR, 2010, 3e éd., 432 p. (ISBN 978-1-435-45742-3).
Ouvrage pour débutants dont la pédagogie prend acte du fait que le C++ fait tourner la
plupart des jeux vidéo en 2010.
[Deitel et Deitel 2004] P. Deitel et H. Deitel, Comment programmer en C++, Reynald
Goulet, 2004, 1178 p. (ISBN 978-2-893-77290-5).
[Delannoy 2001] Claude Delannoy, Programmer en langage C++, Paris,
Eyrolles, 2011, 8e éd., 822 p. (ISBN 978-2-212-12976-2).
[Delannoy 2007] Claude Delannoy, Exercices en langage C++, Paris,
Eyrolles, 2007, 3e éd., 336 p. (ISBN 978-2-212-12201-5).
[Géron et Tawbi 2003] Aurélien Géron et Fatmé Tawbi (préf. Gilles Clavel), Pour mieux
développer avec C++ : design patterns, STL, RTTI et Smart Pointers, Paris, Dunod, 2003,
188 p. (ISBN 978-2-100-07348-1).
[Guidet 2008] Alexandre Guidet, Programmation objet en langage C++, Paris,
Ellipses, coll. « Cours et exercices. », 2008, 364 p. (ISBN 978-2-729-83693-
1, OCLC 221607125, notice BnF no FRBNF41206426).
[Hubbard 2002] J. R. Hubbard (trad. Virginie Maréchal), C++ [« Schaum's easy outline of
programming with C++ »], Paris, EdiScience, coll. « Mini Schaum's », 2002,
192 p.(ISBN 978-2-100-06510-3).
Pour débutants pressés.
[Liberty et Jones 2005] Jesse Liberty et Bradley Jones (trad. Nathalie Le Guillou de
Penanros), Le langage C++ [« Teach yourself C++ in 21 days »], Paris,
CampusPress, 2005, 859 p. (ISBN 978-2-744-01928-9).
[Stephens, Diggins, Turkanis et al. 2006] D. Ryan Stephens, Christopher Diggins,
Jonathan Turkanis et J. Cogswell (trad. Yves Baily & Dalil Djidel), C++ en action [« C++
Cookbook - Solutions and Examples for C++ Programmers »], Paris, O'Reilly, 2006,
555 p. (ISBN 978-2-841-77407-4, OCLC 717532188, notice BnF no FRBNF40170870).
[Stroustrup 2012] Bjarne Stroustrup (trad. Marie-Cécile Baland, Emmanuelle Burr,
Christine Eberhardt), Programmation : principes et pratique avec C++ : Avec plus de 1000
exercices. [« Programming : principles and practice using C++ »], Paris, Pearson
education, 2012, 944 p. (ISBN 978-2-744-07718-0).
[Stroustrup 2003] Bjarne Stroustrup (trad. Christine Eberhardt), Le langage C++ [« The
C++ programming language »], Paris, Pearson education, 2003, 1098 p.(ISBN 978-2-744-
07003-7 et 2-744-07003-3).
[Sutter et Alexandrescu 2005] Herb Sutter et Andrei Alexandrescu, Standards de
programmation C [« C++ Coding Standards: 101 Rules, Guidelines, and Best Practices »],
Paris, Pearson Education France, coll. « C++ », 2005, 243 p. (ISBN 978-2-744-07144-
7 et 2-744-07144-7).
Utlisation des librairies Qt
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 131 sur 132
HIT-T SARL U: web: www.hittechnologie.com E-mail: formationfacile.hitt.tg@gmail.com Tel: 90-47-51-03 /97-31-77-52
Enregistré sous le décret n° 2012-008/PR du 07-03-2012, Arrêté n° 011/MCPSP/CAB/DPSP du 13-04-2012
Consultez le site de : http://www.qtfr.org/ pour obtenir une aide complète sur les librairies
Qt.
Contacts
Tel: (+228) 97 31 77 52 / 90 47 51 03 / 93 32 77 18
E-mail:formationfacile.hitt.tg@gmail.com
Site web: www.hittechnologie.com
01 BP 1341 Lomé-Togo.
Avec HIT-T SARL U, faites la différence!
P.O.O. : C++ et Qt : BTS/ LP/MP-HIT-T/Par A. AKANATE 1ère Edition Page 132 sur 132