Les classes et les objets

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Modèle Logique de données
(Classes prédéfinies – API Java)
C.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Programmation Orientée Objet (POO)
Chapitre III Héritage (début)
Principes de programmation (suite)
Programmation orientée objet
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Principes de programmation (suite)
Conception des données
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Langage Oriente Objet Cours 2.
Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets.
Structures de données IFT Abder Alikacem Transtypage Module 1 Département d’informatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000
Structures de données IFT-2000
Introduction au paradigme orienté-objet (suite)
Points importants de la semaine Le préprocesseur. La conversion de types. Les fonctions.
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
8PRO100 Éléments de programmation Les types composés.
C++ : fonctions et opérateurs
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
INF1101 Algorithmes et structures de données
Structures de données IFT-2000
INF1101 Algorithmes et structures de données
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier.
Structures de données IFT-2000
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 3 Polymorphisme I.
Types de données fondamentaux
Héritage et composition
(Vient du grec et signifie « Peut prendre plusieurs formes »)
2.1 - Historique Chapitre 2 : Introduction au langage C++
Modèle Conceptuel de données
Paradigmes des Langages de Programmation
4 Introduction des objets. Les chaînes et tableaux
Modèle Logique de données
B.Shishedjiev - Conception des données
La notion de type revisitée en POO
Cours 61 6 La sécurité, Portée, Visibilité Programmer avec sécurité.
11/04/ L'héritage Cours 7 Cours 7.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
Tutorat en bio-informatique
Réaliser par: Sadok Amel Cheboui hassiba
Strings et Tableaux en Java
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Les surcharges d'opérateurs
ISBN Chapitre 10 L'implémentation des sous- programmes.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Héritage Conception par Objet et programmation Java
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
Philippe Gandy - 22 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des.
Transcription de la présentation:

Les classes et les objets Cours 2 Les classes et les objets (suite) INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données Plan du cours 2 Objets et membres constants Pointeur this Surcharge d’opérateurs Membres statiques INF1101 Algorithmes et structures de données

I. Objets et membres constants Mot clé const Mot clé du langage spécifiant qu’aucune modification d’un objet, d’une variable ou d’un pointeur n’est permise. La signification du const dans la signature d’une fonction membre d’une classe dépend de sa position. INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données const (suite) Attribut: la valeur est constante, fixée à la création de l’objet. Fonction membre const : ne modifie pas l’objet courant, peut seulement accéder à l’information. Objet const: appel seulement de fonctions membres const. INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données Attribut constant Question: Comment initialiser un attribut constant? Réponse: Par le biais d’une liste d’initialisation class C { public: C() ; ... private: const int x; }; C::C() :x(0) { } INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données II. Le pointeur this Le mot this est un mot réservé contenant l’adresse de l’objet courant. Ce pointeur sert, entre autres, à retourner une référence à cet objet pour les appels en cascade. ex: a = b = c = d; Il ne faut jamais retourner une référence à une variable locale. INF1101 Algorithmes et structures de données

II - Surcharges d’opérateurs Surcharge des opérateurs binaires, unaires, opérateur assignation Commutativité et fonctions globales INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données Introduction La surcharge (ou surdéfinition) d’opérateur est un concept qui permet d’implémenter une fonction ou un opérateur de différentes façons sans en changer la méthode d’appel (signature). INF1101 Algorithmes et structures de données

Besoin de la surcharge d’opérateurs En C/C++, il existe des variables de types simples int, float, double, sur lesquelles on peut effectuer des opérations arithmétiques. En C/C++, il n’existe aucun type de base string, d’où le besoin de créer une classe string pour traiter les chaînes de caractères. Cette classe string posséderait tous les opérateurs définis pour un type tel que un entier ou un double (+, [], +=, etc). INF1101 Algorithmes et structures de données

Application de la surcharge d’opérateurs string S1(“allo ”), S2(“le monde”), S3; S3 = S1 + S2; S3 = S1 + “a tous”; S2[1] = ‘a’; S2[3] = ‘r’; Cet exemple est rendu possible grâce à l’utilisation de la surcharge des opérateurs + et [] pour la classe string. INF1101 Algorithmes et structures de données

Surcharges d’opérateurs Consiste à redéfinir la fonctionnalité d’un opérateur tel que +, -, ou += pour une classe. Il faut bien comprendre le fonctionnement de l’opérateur. L’ordre de priorité est conservé. L’objet est toujours l’opérande de gauche. Les opérateurs gardent leur nombre de paramètres et ne peuvent avoir de paramètres par défaut. ( opérateurs binaires et unaires) Il n’est pas possible de créer de nouveaux opérateurs. INF1101 Algorithmes et structures de données

Surcharges d’opérateurs Pouvant être surchargés Ne pouvant être surchargés . :: ?: sizeof + - * / % ^ & | [] () ~ = < > += -= *= /= %= ^= &= ! ++ -- -> , >> << && != <= >= \= || <<= >>= == new delete INF1101 Algorithmes et structures de données

Surcharges d’opérateurs binaires Opérateur à deux opérandes. Il doit y avoir une opérande à gauche et à droite du symbole de l’opérateur. INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données Opérateurs binaires string S1(“allo”), S2(“le monde”), S3; S3 = S1+S2; // équivalent à S1.operator+(S2); operator+() est une fonction membre de la classe string, car S1 est un objet de la classe string. Retourne un objet string. INF1101 Algorithmes et structures de données

La classe string : string.h class string { public: // Constructeurs string(char ch); string (const char* cstring=“”); ~string() {delete [] buffer}; // Opérations ... string operator + (const string&) const; private: int strLength; int bufferLength char *buffer; INF1101 Algorithmes et structures de données

Implémentation de l’opérateur + de string string string::operator+(const string &cstr) const { string Concat; Concat = *this; // surcharge de l’opérateur = Concat += cstr; // surcharge de l’opérateur += return Concat; } Remarque: l’opérateur + est défini en fonction de l’opérateur += INF1101 Algorithmes et structures de données

Implémentation de l’opérateur + de string (suite) Que se passe-t-il ? string S1(“allo”), S2; S2 = S1 + ”tous”; // ici il y a une conversion // implicite qui est réalisée S1.operator+(“tous”); Conversion implicite: On s’attend à une opérande de type string On a une opérande de type char* Il existe un constructeur qui accepte ce type de paramètre On construira donc un objet de type string en lui passant la chaîne On pourra alors appliquer l’opérateur aux deux opérandes INF1101 Algorithmes et structures de données

Conversion implicite de type Il faut se méfier des conversions implicites, C++ peut en faire à des endroits où on ne s’y attend pas On peut empêcher qu’un objet soit créé par une conversion implicite: il suffit d’ajouter explicit avant la déclaration du constructeur Ainsi, si on déclare le constructeur de la manière suivante: explicit string (const char* cstring=“”); on pourra empêcher la construction d’un string dans les cas suivants: string S1, S2; S = “allo”; S2 = S1 + “allo” INF1101 Algorithmes et structures de données

Implémentation de l’opérateur + de string (suite) Si on déclare le constructeur explicit, l’instruction S2 = S1 + “allo” n’est plus acceptée parce que l’opérateur n’accepte que des opérandes de type string. Dans ce cas, pour que l’instruction soit valide, il faut ajouter une autre définition de l’opérateur: INF1101 Algorithmes et structures de données

Implémentation de l’opérateur + de string (suite) class string { public: // Constructeurs explicit string(char ch); explicit string (const char* cstring=“”); ~string() {delete [] buffer}; // Opérations ... string operator + (const string&) const; string operator + (const char* cstr) const; private: int strLength; int bufferLength; char *buffer; INF1101 Algorithmes et structures de données

Commutativité et fonctions globales Ces derniers exemples de l’opérateur + prennent comme supposition que l’opérateur de gauche est un objet string. Cependant, ceci n’implique pas que cet opérateur est commutatif INF1101 Algorithmes et structures de données

Opérateur + non commutatif string S1(“allo”), F2(“le monde”), F3; char* A = “tous”; S3 = S1 + A; // équivalent à S1.operator+(A); Cet exemple utilise la surcharge: string operator + (const char*) const; Mais S3 = A + S1; //équivalent à A.operator+(S1)??? INF1101 Algorithmes et structures de données

Commutativité et fonctions globales (suite) Si l’on désire définir des opérateurs qui accepte autre chose qu’un objet string à gauche, et un objet string à droite de l’opérateur, il faut se définir des fonctions globales pour permettre cette commutativité. Exemple de surcharge globale de type char + string: string operator+(const char* A, const string& B); INF1101 Algorithmes et structures de données

Commutativité et fonctions globales (suite) Remarque: Si on définit l’opérateur + comme un opérateur global, et qu’on exclut pas la conversion implicite à partir d’un char* lors de l’appel du constructeur, on pourrait se contenter d’une seule définition: string operator+(const string& A, const string& B); INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données Fonctions amies Problème dans certains cas: La fonction globale n’a pas le droit d’accéder au données privées de la classe Solutions: L’opérateur global accède aux données privées par le bien de fonctions membres publiques (peut être inefficace dans certains cas) On déclare la fonction globale comme étant « amie » friend string operator +(char*, const string &); INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données Fonctions amies (suite) Attention: les fonctions amies violent le principe d’encapsulation. À moins de ne pouvoir faire autrement, il vaut mieux les éviter Dans le cas de la classe string, on peut l’éviter, en définissant une fonction globale qui prend en paramètre deux objets de type string: string operator+(const string&, const string&); Dans ce cas, il faut bien entendu que le constructeur accepte la conversion implicite Dans certains cas, on peut éviter de déclarer une fonction amie en n’utilisant que des fonctions membres de la classe pour accéder aux attributs de l’objet, si elles sont suffisantes pour la définition de l’opérateur INF1101 Algorithmes et structures de données

Surcharges d’opérateurs unaires Opérateur ayant un seul paramètre. L’unique argument est implicitement l’objet lui-même. Rational& operator ++ (); Rational& Rational::operator ++ () { numer+=denom; return (*this); Exemple d’utilisation: Rational F(2,3); F++; } INF1101 Algorithmes et structures de données

Surcharges de l’opérateur d’assignation (=) Si l’opérateur = n’est pas surchargé, le compilateur en génère un automatiquement. Cependant, l’assignation se fait attribut par attribut. L’opérateur = par défaut peut causer de sérieux problèmes si l’objet contient des membres construits par allocation dynamique. INF1101 Algorithmes et structures de données

Fonctions membres par défaut Dans une classe, même si le programmeur ne les définit pas, il y a toujours: Un constructeur par défaut s’il n’existe aucun autre constructeur. Un constructeur de recopie (attribut par attribut) La surcharge de l’opérateur = par défaut( attribut par attribut) est créée si une instruction fait appel à cet opérateur. Un destructeur par défaut INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données Attention ! Si votre classe a un attribut qui est un pointeur et alloue de l’espace mémoire dynamiquement, il faut absolument définir: Un constructeur de recopie; L’opérateur =; Et un destructeur; Et surtout ne pas utiliser les fonctions par défaut. INF1101 Algorithmes et structures de données

Exemple de surcharge d’opérateur = et de constructeur copie Dans la classe string, on a retiré le constructeur copie et la surcharge de l’opérateur = class string { public: string(char ch); string(const char*=“”); ~string(); . . . private: char *buffer; int length; }; INF1101 Algorithmes et structures de données

Exemple de surcharge d’opérateur = string a(“hola”),b; b=a; buffer length=4; a h o l a buffer length=4; b INF1101 Algorithmes et structures de données

Exemple de surcharge d’opérateur = string& string::operator=(const string &rhs) { if( this != &rhs) if(bufferLength < rhs.length()+1) delete []buffer; bufferLength=rhs.length()+1; buffer = new char[bufferLength]; } strLength=rhs.length(); strcpy(buffer,rhs.buffer); return *this; INF1101 Algorithmes et structures de données

INF1101 Algorithmes et structures de données IV – Membre statique Un attribut static n’existe qu’en une seule copie pour tous les objets d’une classe. Un attribut static est un espace commun à tous les objets instanciés. L’espace mémoire d’une variable de classe existe même si aucun objet n’a été déclaré. Cette variable est accessible via les fonctions membres ou par l’entremise de l’opérateur de résolution de portée :: . L’initialisation d’une variable de classe ne se fait pas dans le constructeur… INF1101 Algorithmes et structures de données

Fonction de classe static Une fonction de classe static ne peut accéder qu’aux membres static d’une classe. On peut appeler une fonction de classe sans déclarer d’objet par l’opérateur de résolution de portée :: . Les règles d’encapsulation demeurent les mêmes. INF1101 Algorithmes et structures de données

Variable de classe et fonction de classe statiques La classe Sphere possède la variable static nbSphere, qui conserve le nombre total de sphères créées dans le programme. class Sphere{ public: ... static int getNbSphere() {return nbSphere;}; static int nbSphere; }; // Initialisation dans sphere.cpp int Sphere::nbSphere = 0; Fonction de classe INF1101 Algorithmes et structures de données