Programmation orientée objet en C++ Août 2021 Programmation orientée objet en C++ Ch. 1 Introduction à C++ par Alain Pilon •1 Contenu du cours Généralités Interprétation vs compilation Édition de liens Anatomie d’un programme C++ Identificateurs, variables et types de données de base Entrées et sorties en C++, mise en forme de la sortie Portée d’une variable Expressions Opérateurs Opérateurs arithmétiques Manipulation des bits Incrémentation Affectation Relationnel Conditionnel Séquence et taille Conversions explicites et implicites •2 par Alain Pilon Page 1 Programmation orientée objet en C++ Août 2021 Généralités Le langage C++ est né après la combinaison du C et du Simula pour former dans un premier temps le langage « C avec des classes ». En 1983 Bjarne Stroustrup, informaticien pour AT&T, finalise les spécifications et lui donne le nom de C++. Le C++ est simplement une extension du langage C. Le langage Java s’est inspiré de C++ (avec quelques différences importantes). •3 Compilation vs interprétation Compilateur Exécutable Source Interpréteur •4 par Alain Pilon Page 2 Programmation orientée objet en C++ Août 2021 Compilation C++ vs Java Compilateur C++ fichier.cpp Exécutable fichier.java Source Java Virtual Machine Compilateur Java fichier.class •5 Édition de liens Compilateur Objet Source Édition de liens Compilateur Objet Source Exécutable Compilateur Source Objet Librairies •6 par Alain Pilon Page 3 Programmation orientée objet en C++ Août 2021 Anatomie d’un programme C++ #include <iostream> using namespace std; int main() { cout << "IFT1166\n"; return 0; } •7 Découpage du programme Directives au préprocesseur #include <iostream> Espace de noms using namespace std; Programme principal int main( ) ou int main(int argc, char* argv[]) •8 par Alain Pilon Page 4 Programmation orientée objet en C++ Août 2021 Directives au préprocesseur Lignes qui commencent par # Inclusion de fichiers, substitutions, macros et compilation conditionnelle Par exemple: #include <iostream> Informe le préprocesseur de charger le fichier iostream (dans les répertoires standards) et de le compiler en même temps que le fichier courant. Le fichier <iostream> est nécessaire pour faire les entrées/sorties standards en C++. •9 Espace de noms Permet de rendre accessible au programme ce qui est défini dans l’espace de noms mentionné. La directive: using namespace std; Informe le compilateur de rendre accessible tout ce qui est défini dans la bibliothèque std (standard). •10 par Alain Pilon Page 5 Programmation orientée objet en C++ Août 2021 Programme principal Le point d’entrée d’un programme C++ est la méthode main( ) Une seule méthode main( ) doit exister dans un projet et c’est elle qui sera appelée lors de l’exécution du programme. Elle peut avoir aucun paramètre ou les deux paramètres montrés précédemment: argc et argv. argc est un entier qui représente le nombre de paramètres passés au programme. argv contient une liste de paramètres sous forme d’un tableau de chaînes de caractères. La méthode main retourne un entier qui représente l’état de l’exécution du programme. La valeur 0 est retournée pour indiquer que le programme s’est exécuté correctement. Une valeur différente est retournée pour indiquer qu’une erreur s’est produite. •11 C++ vs Java Beaucoup de ressemblance, mais… C++ est un langage procédural avec la capacité de manipuler des objets alors que Java est purement orienté objet. La gestion de la mémoire se fait automatiquement en Java (par garbage collector ou rammasse-miettes). En C++ cette gestion est laissée au programmeur. C++ permet l’héritage multiple pas Java. Par exemple, alors que C++ permettra à une classe d’hériter de Employe et de Etudiant pour créer une nouvelle classe, ce ne sera pas possible en Java. C++ est un langage compilé alors que Java est à mi-chemin entre compilé et interprété (plus près de interprété). •12 par Alain Pilon Page 6 Programmation orientée objet en C++ Août 2021 Normalisation et compilateurs C++ a été normalisé en 1998 pour standardiser la base du langage et la librairie C++ standard. En 2003 une nouvelle normalisation concernant la bibliothèque de modèles standard (STL). Il existe plusieurs compilateurs différents pour le C++ (par compagnies différentes) et ils ne respectent pas nécessairement ces normes. Par exemple, gcc (plus précisément g++) et dev C++. •13 g++ en Linux ou console Windows g++ -v Permet d’afficher la version du compilateur utilisé. g++ test.cpp -o test Permet de compiler le fichier test.cpp et de produire un exécutable dont le nom est test. Cela permet de compiler et de faire l’édition des liens avec la même commande. Nous ferons l’édition de liens séparé lorsque nous aurons plusieurs classes à lier ensemble. g++ test.cpp -o test.o Permet de compiler (sans faire l’édition des liens). g++ -c test.o test2.o -o test Permet de faire l’édition des liens (uniquement). g++ -g test.cpp -o test Compiler, éditer les liens et inclusion des informations de débogage du programme. •14 par Alain Pilon Page 7 Programmation orientée objet en C++ Août 2021 Dev C++ Dev C++ est un environnement intégré de développement. Il permet d’éditer et de compiler des programmes C et C++. •15 Identificateurs Servent à nommer les objets (variables, fonctions, méthodes, classes, etc). Premier caractères: une lettre ou un souligné. Les autres caractères: lettres, chiffres et/ou soulignés. Certains compilateurs ne reconnaissent que les 31 premiers caractères. Les doubles soulignés (deux soulignés consécutifs) sont réservés (ne pas utiliser). Les majuscules et minuscules sont distinguées (A est différent de a). Exemples: Correct: total, total99, nomEtudiant, _bidon, etc… Incorrect: 9ici, __reserve, $pas, étudiant, true, if, int, … Correct (mais soyez assuré que je ne les accepterai pas dans vos travaux): a, b, a1, x1, x2, zz, a123, … Choisissez des noms significatifs. Commencez par une lettre minuscule les variables et méthodes (fonctions) et une lettre majuscule pour classes et types de données. Tout en majuscules pour constantes. •16 par Alain Pilon Page 8 Programmation orientée objet en C++ Août 2021 Mots réservés •17 Types de base Un nombre entier: short int (ou short) int long int (ou long) On peut ajouter le qualificatif unsigned devant (peu utilisé) Représentation des nombres: Décimal: 10, 27 Hexadécimal: 0x8, 0x10, 0xEF Octal: 07, 03, 010 Suffixe: L ou l (pour entier long), U ou u (pour non signé) Exemples de déclaration de variables: int total; int compteur = 2; int nbEtudiants = 0, indice = 9; int x = y = 0; •18 par Alain Pilon Page 9 Programmation orientée objet en C++ Août 2021 Types de base (suite) Un nombre réel: float double long double Représentation des nombres: double: 12.43, -0.38, 4., .27, 4.25E4, 4.e+4, 542.7E-33, 48e13 float: 12.43f, 12.43F long double: 12.43l, 12.42L Exemples de déclaration de variables: double salaire = 35000.00; double moyenne; double totalSalaire = 0.0; •19 Types de base (suite) Un booléen: bool Accepte les valeurs: true, false (interne true vaut 1 et false vaut 0) Exemples de déclaration de variables: bool valide = false; if (valide) … Un caractère: char Accepte un caractère entre apostrophes Exemples: char caractere = 'a'; char finLigne = '\n', tab = '\t'; char aMajuscule = char(65), enHexa = '\x41'; •20 par Alain Pilon Page 10 Programmation orientée objet en C++ Août 2021 Types de base (suite) Une chaîne de caractères: Une suite de caractères entre " (guillemets). Les constantes sont stockés en zone de mémoire permanente. En réalité, elles sont conservées dans un tableau de caractères de longueur de la chaîne plus 1. En effet, un caractère null ('\0') est ajouté à la chaîne pour indiquer la fin. Exemples: char nom[] = "Roger"; char *message; message = "Bonjour"; •21 Types de base (suite) Type énumération: enum Jour { lundi=1, mardi, mercredi, jeudi, vendredi, samedi, dimanche }; Permet d’associer un synonyme textuel pour représenter des valeurs entières; lundi vaut 1, mardi vaut 2 et ainsi de suite… •22 par Alain Pilon Page 11 Programmation orientée objet en C++ Août 2021 Affectation int compteur; // quelle est la valeur de compteur?? compteur = 10; compteur = compteur + 5; compteur += 5; •23 Constantes const int nbEtudiants = 20; Permet d’identifier par un nom une valeur qui ne pourra pas changer pendant l’exécution du programme. La directive au préprocesseur #define peut aussi être utilisée (pas recommandée car le type n’est pas validé) ex: #define nb 20 Exemples: const double baremeIntra = 0.20; const double baremeFinal = 0.40; •24 par Alain Pilon Page 12 Programmation orientée objet en C++ Août 2021 Entrées/Sorties Elles se font à travers des flux de données “stream” en utilisant le fichier <iostream> avec l’instruction #include. #include <iostream> En Java: System.out.println(12); En Java: System.out.printf("%d\n", 12); En C++: std::cout << 12 << std::endl; ou bien: cout << 12 << "\n"; Pour lire: std::cin >> variable; •25 Exemple Entrées/Sorties #include <iostream> int main() { int nombre; std::cout << "Entrez un nombre:"; std::cin >> nombre; std::cout << "Le carre de " << nombre << " est " \ << nombre * nombre << std::endl; return 0; } Démonstration… •26 par Alain Pilon Page 13 Programmation orientée objet en C++ Août 2021 Exemple 2 #include <iostream> using namespace std; int main() { int nombre; cout << "Entrez un nombre:"; cin >> nombre; cout << "Le carre de " << nombre << " est " \ << nombre * nombre << endl; return 0; } •27 Exemple 3 #include <iostream> using namespace std; int main() { int nombre1, nombre2; cout << "Entrez deux nombres:"; cin >> nombre1 >> nombre2; cout << "La somme de " << nombre1 << " et " \ << nombre2 << " est " << nombre1 + nombre2 << endl; return 0; } •28 par Alain Pilon Page 14 Programmation orientée objet en C++ Août 2021 Mise en forme de la sortie #include <iomanip> #include <iostream> using namespace std; int main() { int n = 123; cout << setw(6) << n << endl; // affiche la valeur de n cadré à droite dans 6 espaces cout << setw(2) << n << endl; // affiche n et ne tient pas compte de setw cout << setfill('*') << setw(6) << n << endl; // affiche n précédé de 3 * :***123: cout << hex << n << endl; // affiche en hexa cout << oct << n << endl; // affiche en octal } // Note: les commentaires comme ci-dessus seraient inutiles dans vos progr. •29 Définition des formats d’affichage Format endl Description Affiche le caractère fin de ligne (\n) Précise la longueur minimale du champ en sortie (où x est un entier positif). Affecte seulement le nombre qui suit. setw(x) ou Exemple: cout << setw(7) << 12 << endl; width(x) Qui permet d'afficher le nombre 12 en utilisant exactement 7 position (5 espaces insérés devant le nombre). Pour justifer à gauche ou à droite droite. left ou Exemple: cout << left<< setw(7) << 12 << endl; Qui fait la right même chose que l'exemple précédent mais justifié à gauche (5 espaces insérés après le nombre). Pour remplir avec un car au lieu d'utiliser des espaces. Exemple: cout << setfill('0') << setw(7) << 12 << endl; Qui permet d'afficher le nombre 12 en utilisant setfill(car) exactement 7 position (5 '0' insérés devant le nombre) ==> 0000012. NB: setfill affecte tous les affichages qui suivent. •30 par Alain Pilon Page 15 Programmation orientée objet en C++ Août 2021 Définition des formats d’affichage Format Description Permet de définir combien de chiffres affichés setprecision(x) après le point. Utiliser avec fixed (voir plus loin). Pour afficher les nombres réels en utilisant une fixed notation fixe (opposé de scientifique). Pour afficher les nombres réels en utilisant la scientific notation scientifique. Pour afficher les booléens en format texte (true boolalpha ou false). uppercase, nouppercase, dec, oct, hex, setbase(8), quelques setbase(10), setbase(16), setiosflags( ), autres etc...(faites un peu de recherche sur Internet et vous trouverez facilement leurs significations) Une petite référence: http://www.arachnoid.com/cpptutor/student3.html •31 Exemple 1: #include <iostream> #include <iomanip> using namespace std; int main() { int n = 123; cout << setw(6) << n << endl; cout << setfill('*') << setw(6) << n << endl; cout << hex << n << endl; // affiche en hexa cout << oct << n << endl; // affiche en octal return 0; } •32 par Alain Pilon Page 16 Programmation orientée objet en C++ Août 2021 Exemple 2: #include <iostream> #include <iomanip> using namespace std; int main() { const float tenth = 0.1; const float one = 1.0; const float big = 1234567890.0; cout << "A." << tenth << "," << one << "," << big << endl; cout << "B." << fixed << tenth << ", " << one << ", " << big << endl; cout << "C." << scientific << tenth << "," << one << "," << big << endl; cout << "D." << fixed << setprecision(3) << tenth << "," << one << "," << big << endl; cout << "E." << setprecision(20) << tenth << endl; cout << "F." << setw(8) << setfill('*') << 34 << 45 << endl; cout << "G." << setw(8) << 34 << setw(8) << 45 << endl; return 0; } •33 Spécificités du C++ Commentaires (comme en Java) /* commentaire sur plusieurs lignes */ // le reste de la ligne est ignorée Trop de commentaires c’est comme pas assez! Quoi commenter?? Le programme: au début expliquer son utilité (ce qu’il fait), les valeurs entrées, les valeurs produites (résultats affichés), la date et l’auteur. Chaque variable utilisée. Chaque méthode: utilité, paramètres, valeurs retournées. Dans le programme: les sections plus complexes. Par exemple: // Boucle for ! Commentaire inutile for (int i=0 ; i<10 ;i++) { Il serait plus judicieux de dire à quoi peut servir cette boucle… •34 par Alain Pilon Page 17 Programmation orientée objet en C++ Août 2021 Portée d’une variable { int a; // a est visible ici { int b; // a et b peuvent être utilisées ici { int c; // a, b et c sont visibles ici } // a et b peuvent être utilisées ici } // seulement a est visible ici } •35 Généralisation portée d’une variable #include <iostream> using namespace std; int main() { int i=500; cout << "i du main vaut avant: " << i << endl; for (int i=0; i< 2; i++) { cout << "i boucle vaut: " << i << endl; } cout << "i du main vaut après: " << i << endl; return 0; } En sortie: i du main vaut avant: 500 i boucle vaut: 0 i boucle vaut: 1 i du main vaut après: 500 •36 par Alain Pilon Page 18 Programmation orientée objet en C++ Août 2021 Expression Une expression est la composition d’opérateurs, de variables, de constantes, de fonctions et de parenthèses. Une expression sera évaluée et remplacée par sa valeur. La valeur d’une expression a un type et peut être utilisée dans une autre expression. Exemple: x = y + 25 * z + 32 * t; •37 Opérateurs arithmétiques Notes: 12%10 vaut 2 9%10 vaut 9 C’est le reste de la division entière •38 par Alain Pilon Page 19 Programmation orientée objet en C++ Août 2021 Opérateurs de manipulation de bits •39 Opérateurs d’incrémentation/décrémentation Notes: pré: opération est effectuée avant que la valeur soit utilisée. post: opération est effectuée après que la valeur soit utilisée. Exemples: toto = compteur++ ou ++compteur??? •40 par Alain Pilon Page 20 Programmation orientée objet en C++ Août 2021 Opérateurs d’affectation •41 Opérateurs relationnels Une expression est fausse si elle vaut 0 Elle est vraie sinon (si != 0) •42 par Alain Pilon Page 21 Programmation orientée objet en C++ Août 2021 Exemples op1 op2 op1 && op2 op1 || op2 !op1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 •43 Opérateur conditionnel (expression1) ? expression2 : expression3; « expression1 » est évaluée, si sa valeur est: Vraie: alors « expression2 » est évaluée et son résultat est utilisé. Faux: alors « expression3 » est évaluée et son résultat est utilisé. Exemple: int n = -5; n = (n < 0) ? –n : n; Est-ce que « expression1 » est vraie? -5<0 Oui alors « expression2 » est évaluée et sa valeur est utilisé: - -5 => évaluée à 5 n=5 Attention ne pas mettre un bloc d’instructions (utiliser un if à la place)… •44 par Alain Pilon Page 22 Programmation orientée objet en C++ Août 2021 Opérateur de taille sizeof(expression) Permet d’évaluer la taille occupée par une variable, un type ou une expression. Cette taille dépend de l’architecture interne de l’ordinateur. int i, tab[10]; double x, y; sizeof(i) est évaluée à 4 sizeof(x) est évaluée à 8 sizeof(tab) est évaluée à 40 sizeof(tab[0]) est évaluée à 4 •45 Opérateur de séquence Il est représenté par la virgule et permet d’évaluer les opérations dans l’ordre (de gauche vers la droite). •46 par Alain Pilon Page 23 Programmation orientée objet en C++ Août 2021 Priorité des opérateurs •47 Conversions Implicite Lorsqu’une expression utilise des valeurs de types différents. Par exemple un int et un long dans la même expression ou encore un int et un float. Il y aura automatiquement conversion du type inférieur (plus petit) vers le type supérieur. Le int sera convertit en long ou en float selon le reste de l’expression. Attention cela peut occasionner des bogues si nous ne sommes pas attentif surtout lorsqu’on commence. Il est recommandé de ne pas mélanger les types. •48 par Alain Pilon Page 24 Programmation orientée objet en C++ Août 2021 Conversions Explicite Il s’agit de demander explicitement la conversion dans le type désiré. On appelle cette opération « casting » ou « transtypage ». Exemple: int i = 5; float x = 10.0, y = 20.5; i = int(x); // méthode C++ i = (int)x; // méthode C aussi acceptée •49 par Alain Pilon Page 25