Cours Ge Ne Ral
Une courte introduction à C++ Karl Tombre École des Mines de Nancy Version 1 . O octobre 1999 1 un peu d’histoire Le langage C++ a deux grands ancêtres : – Simula, dont la première version a été conçue en 1967. C’est le premier langage qui introduit les principaux concepts de la programmation objet. Probablement parce qu’il était en av temps, il n’a pas con mais il a eu cependa considérable sur l’év Développé par une é Sni* to u’il aurait mérité, lion objet. égiens, Simula-67 est le successeur de Simula l, luim me inspiré d’Algol 60.
Conçu d’abord à des fins de modélisation de systèmes physiques, en echerche nucléaire notamment, Simula est devenu un langage spécialisé pour traiter des problèmes de simulation. Ses concepteurs faisaient aussi partie du groupe de travail I FIP 1 qui poursuivait les travaux ayant donné naissance à Algol 60. Simula-67 est avec pascal et Algol 68 un des trois langages issus des différentes voies explorées au sein de ce groupe. Son nom fut changé en Simula en 1986. Comme son prédécesseur Simula l, Simula permet de traiter les problèmes de simulation.
En particulier, un objet est considéré comme un programme actif autonome, pouvant communiquer et ynchroniser avec d’autres objets. C’est aussi un langage de a été conçu en 1 972 aux laboratoires Bell Labs. C’est un langage structuré et modulaire, dans la philosophie générale de la famille Algol. Mais c’est aussi un langage proche du système, qui a notamment permis l’écriture et le portage du système Unix. Par conséquent, la programmation orientée système s’effectue de manière particulièrement aisée en C, et on peut en particulier accéder directement aux fonctionnalités du noyau Unix.
C possède un jeu très riche d’opérateurs, ce qui permet l’accès ? a quasi-totalité des ressources de la machine. On peut par exemple faire de l’adressage indirect ou utillser des opérateurs d’incrémentation ou de décalage. On peut aussi préciser qu’on souhaite implanter une variable dans un registre. En conséquence, on peut écrire des programmes presque aussi efficaces qu’en langage d’assemblage, tout en programmant de manière structurée. Le concepteur de C++, Bjarne Stroustrup, qui travaillait également aux Bell Labs, désirait ajouter au langage C les classes de Simula.
Après plusieurs versions préliminaires, le langage a trouvé une première forme table en 1983, et a très rapidement connu un vif succès dans le monde industriel. Mais ce n’est qu’assez récemment que le langage a trouvé sa forme définitive, confirmée par une norme. C++ peut être considéré comme un successeur de C. Tout en gardant les points forts de ce langage, il corrige certains points faibles et permet l’abstraction de données. De plus, il permet la programmation objet.
D’autres langages, et en particulier Java, se sont fortement inspirés de la syntaxe de C++. Celle-ci est de ce fait devenue une référence. Nous supposons en particulier que les élèves qui ont déjà appris Java OF fait devenue une référence. Nous supposons en particulier que les élèves qui ont déjà appris Java ne seront pas dépaysés par ce langage. Cependant, nous voulons mettre en garde contre plusieurs fausses ressemblances : si la syntaxe est la même ou très proche, plusieurs concepts sous-jacents sont différents.
Nous nous efforcerons de signaler ces pièges potentiels. 2 Types de base et constantes En C++, les types de base sont : – bool : booléen 2, peut valoir true ou false, – char : caractère (en général 8 bits), qui peuvent aussi être déclarés explicitement signés (signed har) ou non signés (unsigned char), int : entier (1 6 ou 32 bits, suivant les machines), qui possède les variantes short [int] et long tint], tous trois pouvant également être declarés non signés (unsigned), – float : réel (1 mot machine), 1 .
International Federation for Information Processing. 2. La présence d’un type booléen explicite est assez récente ; auparavant, les entiers étaient interprétés comme des booléens suivant leur valeur nulle ou non-nulle, et par compatibilité C++ continue ? accepter des valeurs entières à la place de valeurs booléennes. double : réel en double précision (2 mots machines), et sa variante long double (3 ou 4 mots machine), – Void qui spécifie un ensemble vide de valeurs.
Les constantes caractères s’écrivent entre quotes simples • ‘G décimale, hexadécimale (précédées de Ox 3 ) ou octale (précédées de 0 4 Pour forcer la constante à être de type entier long, il faut ajouter un Là la fin, de même le suffixe u indique une constante non signée • 12 -43 85 18642 54L 255U 38111 Oxabfb 0x25D3a 0x3a 0321 07215 01526 Les constantes réelles s’écrivent avec point décimal et ?ventuellement en notation exponentielle : 532. 652 -286. 34 52e+4 42. 3E-12 12. 73 -28. 15e4 Les constantes de type chaînes de caractères (voir plus loin) s’écrivent entre double-quotes : « Home sweet home » « Français, je vous ai compris. » 3 Opérateurs et expressions C++ offre un jeu très étendu d’opérateurs, ce qui permet l’écriture d’une grande variété d’expressions. IJn principe général est que toute expression retourne une valeur. On peut donc utiliser le résultat de l’évaluation d’une expression comme partie d’une autre expression.
De plus, le parenthésage ermet de forcer l’ordre d’évaluation. Les opérateurs disponibles sont les suivants : 3. 1 Opérateurs arithmétiques Il est donc possible d’écrire a = c+2; ceci revenant à affecter à b le résultat de l’évaluation de c+2, puis à a le résultat de l’affectation b = c+2, c’est-à-dire la valeur qu’on a donnée à b. Remarquez l’ordre dévaluation de la droite vers la gauche. 3. Opérateurs d’incrémentation et de décrémentation ++ incrémentation – décrémentation Ces opérateurs, qui ne peuvent être appliqués que sur les types scalaires, peuvent s’employer de deux manières : en rlncipe, s’ils préfixent une variable, celle-ci sera incrémentée (ou décrémentée) avant utilisation dans le reste de l’expression ; s’ils la postfixent, elle ne sera modifiée qu’après utilisation. Ainsi : donnera à c la valeur O, alors que b; lul donnera la valeur -1.
Faites cependant attention dans les expressions un peu complexes où on réutilise la même variable plusieurs fois : l’ordre d’évaluation n’est pas garanti, et l’expression peut donc avoir des résultats différents suivant la machine utilisée. Par exemple, le résultat de rexpression suivante est indéfini t[++a] = a; . 5 Opérateurs logiques Ce sont les opérateurs permettant d’effectuer des opérations au niveau des bits (masquages). & AND. Exemple : a & 0x000F extrait les 4 bits de poids faible de OR.
Ainsi, b = b OXIOO e bit de b. PAGF s OF l’affectation, l’incrémentation et la décrémentation. Il arrive très souvent qu’on calcule la nouvelle valeur d’une variable en fonction de son ancienne valeur. C++ fournit pour cela un jeu d’opérateurs combinés, de la forme cvariable> où
Pour cela existe le mécanisme de cast 5 : («nom de type>) expression retourne une valeur dont le type est celui qui est indiqué dans la première parenthèse, et qui est obtenue en convertissant le résultat de l’ex ression dans le type spécifié. Pour finir ce paraeraphe, ue l’appel à une fonction PAGF OF ci-dessous un tableau récapitulatif des opérateurs de C++, classés dans l’ordre décroissant des priorités.
Certains de ces opérateurs n’ont pas été mentionnés ci-dessus, mais sont décrits dans la suite du polycopié. 2 4 6 7 9 10 12 13 14 15 16 Fonction/Sé ection/Portée Unaire Multiplicatif Additif Décalages Relationnels Inégalité/EgaIité ET logique XOR logique OLI logique ET relationnel OU relationnel Affectation Conditionnel 7 OF souvent le programme principal, par abus de langage. Il serait sûrement plus correct de dire que c’est le point d’entrée à l’exécution du programme.
Ceci étant dit, il est fortement conseillé de ne pas multiplier les fonctions hors classe ; dans bien des cas, seule la fonction main, et éventuellement quelques fonctions annexes à des fins utilitaires, ont vocation à être définies hors d’une structuration en classes. De même, nous déconseillons fortement l’emploi de variables globales ; comme en Java, il est beaucoup plus judicieux, lorsque cela est nécessaire, d’utiliser des variables de classe regroupées dans une classe ad hoc.
Chaque fonction a la syntaxe suivante typeRetour nom DeLaFonction(spécification des paramètres formels) suite de déclarations de variables locales et d’instructions Les paramètres formels doivent être séparés par des virgules, et sont typés. Précisons ces notions en voyant une petite fonction : int moyenne(int a, int b) int c = (a+b)/2; return c; Remarque : comme en Java, on peut passer à la fonction main des parametres correspondant aux paramètres d’appel du programme. 4. Instructions et blocs Chaque instruction est terminée par un point-virgu e. À noter que le point-virgule est une terminaison d’instruction et non un séparateur d’instruction. En particulier, pour qu’une expression soit considérée comme une instruction, elle doit ê ar un ; même si elle est la PAGF 8 OF des variables locales à ce bloc int cumul = 0; for (int i=O; i < n ; i++) Attention à l'instruction vide — qui est source potentielle 'erreurs difficiles à détecter, comme dans Exemple d'une instruction vide involontaire *l for ( . / Ici le point-virgule indique une instruction vide // à exécuter à chaque itération ; ce n'était pas // forcément le souhait du programmeur Vous avez peut-être remarqué que j'ai lâchement profité de l'occasion pour introduire les deux types de commentaires valides en C+4. Les portions de code comprises entre l* et sont des commentaires, de même que celles comprises entre // et la fin de la ligne. 4. Structures conditionnelles La condition s'exprime de la manière suivante : f («expression>) [else
Par ne faut PAGF q OF d’instructions> break; efault :