Cours Ge Ne Ral

essay A+

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ù est un opérateur. une telle expression est équivalente ? l’expression : = – a +- b équivaut à a = a + b; — À noter : a++ idem, de même que 3. 7 Expressions conditionnelles exprl? xpr2 : expr3 est évaluée de la manière suivante : si exprl alors expr2 sinon expr3 fsi Cela est pratique par exemple pour calculer le maximum de 2 nombres sans passer par une fonction Cette construction pourrait bien sûr s’exprimer avec une structure conditionnelle de la forme si—alors-sinon, mais l’écriture sous forme d’expression conditionnelle est plus compacte. 3. 8 Conversions de types On désire souvent changer le type du résultat retourné par une expression.

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 ] où l’exécution de la branche alors ou de la branche sinon va dépendre de Févaluation de : si le résultat est vrai, on exécutera , sinon on effectuera De manière tout ? fait classique, s’il y a plusieurs instructions dans la partie alors ou la partie sinon, on mettra un bloc. Quand il y a plusieurs conditions imbriquées et qu’il y a ambiguïté sur un else, on le rattache au if le plus proche. une autre instruction conditionnelle se comporte comme un branchement calculé.

Par ne faut PAGF q OF d’instructions> break; efault : Si on ne met pas de break, l’exécution va continuer à la suite au lieu de sortir du switch, puisque les différentes constantes correspondent seulement à des étiquettes de branchement. Ily a parfois des cas où c’est l’effet souhaité ; mais il faut être prudent ! 4. 3 Structures itératives Plusieurs structures itératives existent en C++. Voici la première : while la partie pouvant bien sûr être un bloc. C’est la structure tant-que classique. Une autre structure itérative est la suivante . or ; ; ) ù et sont des expressions. Souvenez-vous qu’une expression peut aussi être une suite d’expressions séparées par des virgules. C’est dans cette structure que cela est le plus utilisé. Cette constructlon est équivalente à : ; ; Résumons en disant que indique l’initialisation avant entrée dans la boucle, est la condition de poursuite de l’itération, et est la partie qu’on effectue à la fin de chaque itération. une ou plusieurs de ces expressions peuvent être vides ; en particulier : for(;;) est une boucle infinie !