renforcer le contrôle de type :

Documents pareils
Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Quelques éléments de compilation en C et makefiles

I. Introduction aux fonctions : les fonctions standards

UE Programmation Impérative Licence 2ème Année

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Conventions d écriture et outils de mise au point

Chapitre 2. Classes et objets

Le langage C. Séance n 4

Claude Delannoy. 3 e édition C++

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string


Chapitre 1 : La gestion dynamique de la mémoire

LE LANGAGE C++ ENAC 1997 A. DANCEL

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Introduction au langage C

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Les chaînes de caractères

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours 1: Java et les objets

Entraînement au concours ACM-ICPC

Algorithmique et Programmation, IMA

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Programmation système I Les entrées/sorties

Les structures. Chapitre 3

Cours d initiation à la programmation en C++ Johann Cuenin

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours d Algorithmique et de Langage C v 3.0

Bases de programmation. Cours 5. Structurer les données

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

et Programmation Objet

Analyse de sécurité de logiciels système par typage statique

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Le prototype de la fonction main()

Généralités sur le Langage Java et éléments syntaxiques.

Initiation. àl algorithmique et à la programmation. en C

TP : Gestion d une image au format PGM

Onglet sécurité de Windows XP Pro et XP Home

Héritage presque multiple en Java (1/2)

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours Langage C/C++ Programmation modulaire

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Programmation impérative

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Introduction à l algorithmique et à la programmation M1102 CM n 3

Compression de Données - Algorithme de Huffman Document de Conception

Programmation par les Objets en Java

Programmer en JAVA. par Tama

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Premiers Pas en Programmation Objet : les Classes et les Objets

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

TP1 : Initiation à Java et Eclipse

Plan Pédagogique du cours

Initiation à JAVA et à la programmation objet.

Cours Programmation Système

Cours 14 Les fichiers

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

COMPARAISONDESLANGAGESC, C++, JAVA ET

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Arguments d un programme

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Initiation à la programmation en Python

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Rappels Entrées -Sorties

Le langage C++ (partie I)

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

TP, première séquence d exercices.

Java c est quoi? Java pourquoi?

C++ : PROGRAMMATION-OBJET

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Introduction à C++ et à wxwidgets

Le langage C. Introduction, guide de reference

Programmation stochastique

Programmation C++ (débutant)/instructions for, while et do...while

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

INITIATION A LA PROGRAMMATION

Travaux Dirigés n 1 : chaînes de caractères

Langage Java. Classe de première SI

Chap III : Les tableaux

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Présentation du langage et premières fonctions

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

TP 1. Prise en main du langage Python

Plan du cours. Historique du langage Nouveautés de Java 7

SUPPORT DE COURS. Langage C

Transcription:

renforcer le contrôle de type : définitions, prototypes de fonctions surcharge références conversions de void * préférer le compilateur au préprocesseur considérer les entrées/sorties opérations abstraites préférer new/delete à free et malloc petites différences notes aux programmeurs C

quand le compilateur C++ rencontre un appel de fonction il ne l'accepte que si la fonction a déjà été déclarée ou définie puis il compare le type des arguments effectifs à celui des paramètres formels en cas de différences des promotions numériques et des conversions standard sont implicitement mises en place

Comme en C fichier.h portée du prototype Différences fonctions sans arguments en C: en C++ : fonctions int f(void) int f() sans valeurs de retour en C: en C++ : arguments f(int, int)) ou void f(int, int) par défaut nouveauté très utilisée void f(int, int)

renforcer le contrôle de type : définitions, prototypes de fonctions surcharge surcharge des fonctions polymorphisme ad hoc recherche du code surcharge et éditions de liens références conversions de void * préférer le compilateur au préprocesseur considérer les entrées/sorties opérations abstraites préférer new/delete à free et malloc

permet de réaliser le "polymorphisme ad hoc" mécanisme : un même nom désigne différentes fonctions dans une même portée le compilateur choisit la fonction à appliquer en fonction du type des arguments simplifie la tâche du programmeur qui n'a plus à mémoriser et à taper des noms barbares

concept très important en programmation et particulièrement en POO : du grec, signifie plusieurs (poly) formes (morphos) définition : un même nom représente plusieurs objets selon le contexte 3 types de polymorphisme le polymorphisme ad hoc le polymorphisme d'héritage (Cf. cour 3) le polymorphisme paramétrique polymorphisme ad hoc ou surcharge (overloading) : définir plusieurs fonctions de même nom, chacune correspondant à des types de paramètres précis

fonction à un argument : meilleure correspondance possible 1/ correspondance exacte 2/ promotions numériques 3/ conversions standard (dégradantes) 4/ conversions définies par l'utilisateur arrêt : au premier niveau où correspondance unique si à un même niveau plusieurs correspondances : erreur à la compilation (ambiguïté) si aucune fonction ne convient : erreur de compilation (fonction inconnue)

fonctions à plusieurs arguments 1/ le compilateur sélectionne pour chaque argument la (ou les) meilleure(s) fonction(s) 2/ il considère l'intersection des ensembles des meilleures fonctions pour chaque argument Si cette intersection contient une seule fonction, c'est la fonction choisie sinon erreur de compilation Remarque : fonction avec un ou plusieurs arguments par défaut traitée comme plusieurs fonctions différentes avec un nombre croissant d'arguments

Le compilateur modifie les noms externes des fonctions Nouveau nom : nom interne + nombre et type des arguments Problème des fonctions C : fournir un prototype précédé de extern "C"

renforcer le contrôle de type : définitions, prototypes de fonctions surcharge références passage des paramètres retour d'un résultat plus généralement conversions de void * préférer le compilateur au préprocesseur considérer les entrées/sorties opérations abstraites préférer new/delete à free et malloc petites différences notes aux programmeurs C

une référence est un alias pour un objet comme un pointeur elle est représentée par l'adresse d'un objet contrairement à un pointeur on accède directement à l'objet référencé sans recourir à l'opérateur d'indirection utilisation : pour éviter des manipulations sur les pointeurs en particulier : passage des paramètres d'une fonction type de retour pour une fonction

en C : par défaut : passage par valeur argument modifié ou "gros objet" : passage par adresse, i.e. passage par valeur d'un pointeur sur l'objet en C++ : par défaut : idem, passage par valeur argument modifié ou "gros objet" : passage par références le compilateur prend en charge la transmission des arguments par adresse l'utilisateur manipule une variable normal philosophie C++ : les ptr indiquent une indirection, pas des manipulations pour faire remonter des modifications vers le code appelant

passage par adresse (pointeur) avantage l'utilisateur sait que le paramètre effectif peut être modifié car il passe un ptr à l'appel contrôle des effets de bords indésirés inconvénients lourdeur d'écriture, sources d'erreurs l'utilisateur doit savoir qu'il faut passer un pointeur utilisation en C paramètre modifié par une fonction gros objet passé en paramètre pour éviter une copie

passage par référence avantage simplifie l'écriture : on manipule (à l'appel et dans la définition) le nom des variables, pas un ptr choix au moment de la définition, à l'appel rien à faire de spécial inconvénients risque d'effets de bord indésirés si l'utilisateur oublie que le paramètre peut être modifié essayer d'éviter les fonctions qui modifient leurs paramètres utilisation en C++ : remplace la passage de paramètre par adresse du C

retour du résultat d'une fonction la valeur retournée par une fonction est passée par valeur pour les gros objets, plus efficace de retourner une référence sur l'objet 2 difficultés retourner une référence sur un objet local (bogue de la "référence pendante", message d'avertissement) (remarque : même pb si on retourne un ptr sur un objet local bogue du "ptr fou") retourner une lvalue (surtout utilisé pour la surcharge d'opérateurs)

notion de référence : plus générale que ce qui est présenté ici réalisation d'une référence pointeur constant qui est déréférencé (par le compilateur) à chaque utilisation une référence doit être initialisée au moment de sa déclaration par une lvalue (objet dont on peut prendre l'adresse) une référence ne peut pas être modifiée (seul l'objet référencé peut l'être s'il n'est pas constant) pour les types de base : lvalue obligatoire pour les références à des constantes : subtil (cf doc) utile pour la définition d'arguments par défaut

renforcer le contrôle de type : définitions, prototypes de fonctions surcharge références conversions de void * préférer le compilateur au préprocesseur considérer les entrées/sorties opérations abstraites préférer new/delete à free et malloc petites différences notes aux programmeurs C

En C++, les pointeurs de type void * ne sont pas convertis implicitement en un pointeur d'un autre type, mais un pointeur de type quelconque est converti implicitement en void * En C, conversions implicites dans les deux sens

renforcer le contrôle de type : préférer le compilateur au préprocesseur const préféré à #define fonctions en ligne préférées aux macros considérer les entrées/sorties opérations abstraites préférer new/delete à free et malloc petites différences notes aux programmeurs C

pour nommer des constantes en C: #define en C++ : le spécificateur de type const avantages : limiter la portée des constantes (à un fichier, à une classe) ne pas encombrer l'espace global des noms accepter des expressions similitudes C++/C ANSI : un objet déclaré constant ne peut être modifié le compilateur signale les tentatives de modifications un objet constant doit être initialisé

quand une fonction est déclarée inline, le compilateur essaiera d'insérer (de développer) le code (machine) de la fonction aux endroits où la fonction est appelée économie de temps (pas d'appel de fonction) taille du code croît avec le nombre d'appels syntaxe : placer le mot clé inline devant sa définition la définition d'une fonction en ligne doit apparaître avant tout appel de la fonction dans le même fichier interdit la compilation séparée de la fonction en ligne oblige à placer la définition des fct inline dans les fichiers d'en-tête le compilateur peut ne pas pouvoir développer une fct en ligne (boucle...)

avantages : éviter le surcoût en temps d'un appel de fonction (Coplien : temps divisé par 4) préférable aux macro : compilateur/ préprocesseur contrôle de type comme pour les fct pas les effets de bords des macros permet le déverminage (pas tjrs) inconvénients ne permet pas la compilation séparée (entorse à la séparation client/programmeur) augmentation du code si la fct est longue utilisation : ne pas abusez régle des 80/20 : constructeurs, fct très courtes

meilleur typage : préférez le compilateur au préprocesseur entrées/sorties opérations abstraites préférez new/delete à free et malloc petites différences Notes aux programmeurs C

la bibliothèque stdio.h de C peut être utilisée, mais c'est dommage iostream. h permet de disposer d'e/s faciles à utiliser (plus de format) module objet plus petit (C++ n'inclut que le code nécessaire) extensible aux classes utilisateurs conforme au modèle de programmation objet

cout objet prédéfini (un flot) de C++ : associé à sortie standard (stdout) on envoie à cout un message << int n = 4; cout << "voilà un entier :" << n ; l'opérateur << (de décalage) est surchargé pour cout et les types usuels il provoque l'écriture sur cout de l'argument (ici la chaîne) et retourne cout par le mécanisme de surcharge, cout reconnaît le type de l'argument de l'opérateur de décalage et lui applique le code voulu ; cela dispense le programmeur de l'écriture du format

on utilise l'opérateur << pour envoyer sur cout type de base quelconque (char, int, float) chaîne de caractères (char *) : tous les caractères de la chaîne sont écrits dans cout pointeur (autre que des char *) : écriture de l'adresse correspondante pour avoir l'adresse d'une chaîne : la "caster" void * (pourquoi?) possibilité de surcharger << pour afficher des objets des classes utilisateurs

cin objet prédéfini (un flot) de C++ : associé à entrée standard (stdin) on envoie à cin un message : int n, p ; cin >> n >> p; l'opérateur >> (de décalage) est surchargé pour cin et les types usuels les paramètres sont passés par référence plus besoin d'appeler avec le & lecture des caractères dans le flot d'entrée stdin jusqu'à rencontrer un séparateur et les convertit en une valeur (ici entière) rangée dans n ; enfin cin est retourné

exploration du flot jusqu'à la rencontre d'un séparateur (espace, tabulation...) caractère invalide pour le type à lire provoque l'arrêt de l'exploration mais ce caractère est repris lors de la prochaine lecture lecture d'un caractère sur cin commence par sauter les séparateurs

syntaxe new type retourne un pointeur sur la zone allouée pour le type ou null fait appel au constructeur du type (cf. cours 4) new type [n] retourne un pointeur sur n cellules contiguës delete ad libère delete [] ad pour les tableaux d'objets (Cf. cours 5)

les constantes caractère ne sont pas des entiers commentaire en fin de ligne : // déclarations et initialisations peuvent être placées où l'on veut (mais avant d'être utilisées)

écrire du C++ avec un style C : perdre bénéfices de C++ utilisez const et inline plutôt que #define ne déclarez pas de variable avant d'en avoir besoin n'utilisez pas malloc/free : new/delete fait le même travail et mieux préférez iostream.h à stdio.h évitez void*, arithmétique de pointeur, les tableaux C, les conversions de types explicites penser un programme C++ comme un ensemble de concepts interagissant non comme un ensemble de structures de données manipulés par des fonctions