La magie de la POO par l'exemple : string - Programmation - L 4/La magie de la POO par l'exemple.pdf · La magie de la POO par l'exemple : string - Programmation - Lecture d

  • Upload
    vanlien

  • View
    225

  • Download
    6

Embed Size (px)

Citation preview

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    1 sur 8 23/08/2007 02:16

    Auteur : M@teo21Cr le : 06/12/2006 21h18Modifi le : 04/07/2007 18h35Noter et commenter ce tutorialImprimer ce tutorial

    La magie de la POO par l'exemple : string

    Nous attaquons maintenant la 2me moiti de la partie IV sur le C++. Et commedans la vie rien n'est jamais simple, cette "deuxime moiti" sera la plus grosse

    et... la plus dlicate aussi

    Nous allons maintenant, et dans les chapitres suivants, dcouvrir la notion deprogrammation oriente objet (POO). Comme je vous l'ai dit plus tt, c'est unenouvelle faon de programmer. Ca ne va pas rvolutionner immdiatement vosprogrammes, a va vous paratre un peu inutile au dbut (comme lorsque vous

    aviez dcouvert les pointeurs ), mais faites-moi confiance : faites l'effort de faire ce que je dis la lettre, et bientt vous serez

    bien plus efficaces lorsque vous programmerez.

    Ce chapitre va vous parler des 2 facettes de la POO, le ct utilisateur et le ct crateur.

    Puis, je vais faire carrment l'inverse de ce que tous les cours de programmation font (je sais je suis fou ) : au lieu de commencer

    par vous apprendre crer des objets, je vais d'abord vous montrer comment les utiliser avec pour exemple le type string fourni par le langage C++.

    Sommaire du chapitre :Des objets... pour quoi faire ?Lire et crire dans une chane via stringOprations sur les string

    Q.C.M.

    Des objets... pour quoi faire ?

    Ils sont beaux, ils sont frais mes objets

    S'il y a bien un mot qui doit vous frustrer depuis que vous en entendez parler, c'est celui-ci : objet.

    Encore un concept mystique ? Un dlire de programmeurs aprs une soire trop arrose ? Non parce que franchement, un objet c'est quoi ? Mon cran est un objet, ma voiture est un objet, mon tlphone portable...ce sont tous des objets !

    Bien vu, c'est un premier point

    En effet, nous sommes entours d'objets. En fait, tout ce que nous connaissons (ou presque) peut tre considr comme un objet. L'idede la programmation oriente objet, c'est de manipuler des lments que l'on appelle des "objets" dans son code source.

    Mais concrtement, c'est quoi ? Une variable ? Une fonction ?

    Ni l'un, ni l'autre. C'est un nouvel lment en programmation.

    Pour tre plus prcis, un objet c'est... un mlange de plusieurs variables et fonctions

    Ne faites pas cette tte-l, vous allez dcouvrir tout cela par la suite

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    2 sur 8 23/08/2007 02:16

    Imaginez... un objet

    Pour viter que ce que je vous raconte ressemble un trait d'art moderne conceptuel, on va imaginer ensemble ce qu'est un objet l'aide de plusieurs schmas concrets. Les schmas 3D que vous allez voir par la suite ont t raliss pour moi par l'ami Nab, que je remercie d'ailleurs vivement au passage.

    Imaginez qu'un programmeur dcide un jour de crer un programme qui permet d'afficher une fentre l'cran, de la redimensionner,de la dplacer, de la supprimer... Le code est complexe : il va avoir besoin de plusieurs fonctions qui s'appellent entre elles, et devariables pour mmoriser la position, la taille de la fentre, etc. Il met du temps crire ce code, c'est un peu compliqu, mais il y arrive. Au final, le code qu'il a crit est compos de plusieursfonctions et variables. Quand on regarde a pour la premire fois, a ressemble une exprience de savant fou laquelle on necomprend rien :

    Ce programmeur est content de son code et veut le distribuer sur internet pour que tout le monde puisse crer des fentres sans passerdu temps tout rcrire. Seulement voil, moins d'tre un expert en chimie certifi, vous allez mettre pas mal de temps avant decomprendre comment tout ce bazar fonctionne.

    Quelle fonction appeler en premier ? Quelles valeurs envoyer quelle fonction pour redimensionner la fentre ?

    C'est l que notre ami programmeur pense nous. Il conoit son code de manire oriente objet. Cela signifie qu'il place tout son bazar chimique l'intrieur d'un simple cube. Ce cube est ce qu'on appelle un objet :

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    3 sur 8 23/08/2007 02:16

    Ici, une partie du cube a t volontairement mise en transparence pour vous montrer que nos fioles chimiques sont bien situes l'intrieur du cube. Mais en ralit, le cube est compltement opaque, on ne voit rien de ce qu'il y a l'intrieur :

    Ce cube contient toutes les fonctions et les variables (nos fioles de chimie), mais il les masque l'utilisateur.

    Au lieu d'avoir des tonnes de tubes et fioles chimiques dont il faut comprendre le fonctionnement, on nous propose juste quelques boutons sur la face avant du cube : un bouton "ouvrir fentre", un bouton "redimensionner", etc. L' utilisateur n'a plus qu' se servir desboutons du cube et n'a plus besoin de se soucier de tout ce qui se passe l'intrieur. Pour l'utilisateur, c'est donc compltementsimplifi.

    En clair : programmer de manire orienter objet, c'est crer du code source (peut-tre complexe), mais que l'on masque en le plaant l'intrieur d'un cube (un objet) travers lequel on ne voit rien. Pour le programmeur qui va l'utiliser, travailler avec un objet est donc beaucoup plus simple qu'avant : il a juste appuyer sur des boutons et n'a pas besoin d'tre diplm en chimie pour s'en servir.

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    4 sur 8 23/08/2007 02:16

    Bien sr, c'est une image, mais c'est ce qu'il faut comprendre et retenir pour le moment

    Nous n'allons pas voir tout de suite comment faire pour crer des objets. En revanche, nous allons apprendre en utiliser un. Nous allons crer des objets de type string. Le type string est fourni par la librairie standard du C++.

    Ce qui va suivre devrait vous convaincre une fois pour toutes que travailler avec des objets, bon sang que c'est simple (bon les crer

    sera une autre paire de manches, mais ne gchons pas la fte qui va suivre ).

    Lire et crire dans une chane via string

    Vous vous souvenez des chanes de caractres ? Vous vous souvenez de ce chapitre un peu compliqu o je vous avais dit qu'une chanetait un tableau de char, que toute chane devait se terminer par un

    Oprations sur les string

    Le type string ne s'arrte pas ce que nous venons de voir. Comme tout bon objet qui se respecte, il propose un nombre importantd'autres fonctionnalits qui permettent de faire tout ce qu'on a besoin avec.

    Nous n'allons pas passer toutes les fonctionnalits des string en revue (elles sont pas toutes indispensables et ce serait un peu long).

    Nous allons voir les principales dont vous pourriez avoir besoin dans la suite du cours

    Attributs et mthodes

    Je vous avais dit qu'un objet tait constitu de variables et de fonctions. En fait, on en reparlera plus tard mais le vocabulaire est unpeu diffrent avec les objets. Les variables contenues l'intrieur des objets sont appeles attributs, et les fonctions sont appelesmthodes.

    Imaginez que chaque mthode (fonction) que propose un objet correspond un bouton diffrent sur la faade avant du cube

    On parle aussi de "variables membres" et de "fonctions membres", ce qui est peut-tre un peu moins droutant que

    "attributs" et "mthodes" qui sont des mots compltement nouveaux et auxquels on a un peu de mal se faire au dbut

    Appeler une mthode d'un objet se fait de la mme manire qu'avec les structures. On utilise le point pour sparer l'objet de samthode :

    objet.methode()

    En thorie, on peut aussi accder aux variables membres (les "attributs") de l'objet de la mme manire qu'on le faisaitavec les structures. Cependant, en POO, il y a une rgle super importante qui dit que l'utilisateur ne doit pas pouvoir accderaux variables membres, mais seulement aux fonctions membres. On en reparlera dans le prochain chapitre plus en dtail.

    Quelques mthodes utiles du type string

    La mthode size()

    La mthode size() permet de connatre la longueur de la chane actuellement stocke dans l'objet de type string. C'est un peu

    l'quivalent de strlen(), mais pour les string cette fois

    Cette mthode ne prend aucun paramtre et renvoie la longueur de la chane. Comme vous venez de le dcouvrir, il va falloir appeler lamthode de la manire suivante :

    Code : C++ - Afficher / masquer les numros de ligne

    maChaine.size()1.

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    5 sur 8 23/08/2007 02:16

    Essayons a dans un code complet qui affiche la longueur de la chane :

    Code : C++ - Afficher / masquer les numros de ligne

    Code : Console - Afficher / masquer les numros de ligne

    Bingo !

    C'est l toute la subtilit. Avant on aurait d faire :

    Code : C - Afficher / masquer les numros de ligne

    La fonction strlen tait valable pour n'importe quelle chane, mais il fallait prciser en paramtre chaque fois quelle tait la chanesur laquelle la fonction devait travailler.

    Maintenant, l'ordre est un peu invers. La fonction size() est contenue dans l'objet maChaine. Quand on l'appelle comme on vient de lefaire, la fonction membre size() sait qu'elle doit calculer la longueur de la chane contenue dans l'objet o elle se trouve :

    Code : C++ - Afficher / masquer les numros de ligne

    La fonction size() est donc propre l'objet maChaine. Si vous crez un deuxime objet de type string, il y aura donc une autre fonctionsize() propre cet autre objet.

    Rassurez-vous, les compilateurs C++ sont suffisamment intelligents pour optimiser l'utilisation de la mmoire. Si vouscrez 50 string, il n'y aura pas 50 fois la mme fonction en mmoire (une seule suffit). Mais ce que je vous dis l, c'est ce qu'ilfaut "imaginer". Dans chaque objet (chaque bote), il y a une fonction size() qui est propre l'objet. C'est comme cela qu'ilfaut le voir.

    La mthode erase()

    Cette mthode trs simple supprime tout le contenu de la chane :

    Code : C++ - Afficher / masquer les numros de ligne

    Code : Console - Afficher / masquer les numros de ligne

    int main()1.

    {2. string maChaine = "Bonjour !";3. cout

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    6 sur 8 23/08/2007 02:16

    Comme on pouvait s'y attendre, la chane ne contient plus rien

    Notez que c'est quivalent faire :

    Code : C++ - Afficher / masquer les numros de ligne

    La mthode substr()

    Une autre mthode qui peut s'avrer utile : substr(). Elle permet de ne prendre qu'une partie de la chane stocke dans un string.

    substr signifie "substring", soit "sous-chane" en anglais.

    Tenez, on va regarder son prototype, vous allez voir que c'est intressant :

    Code : C++ - Afficher / masquer les numros de ligne

    Cette mthode retourne donc un objet de type string. Ce sera la sous-chane aprs "dcoupage".Elle prend 2 paramtres, ou plus exactement : 1 paramtre obligatoire, 1 paramtre facultatif. En effet, num possde une valeur pardfaut (npos) ce qui fait que le second paramtre ne doit pas obligatoirement tre renseign.

    index permet d'indiquer partir de quel caractre on doit couper (ce doit tre un numro de caractre)num permet d'indiquer le nombre de caractres que l'on prend. Par dfaut, la valeur est npos, ce qui correspond prendre tousles caractres qui restent. Si vous indiquez 2, la mthode ne renverra que 2 caractres.

    Allez, un exemple sera plus parlant je crois

    Code : C++ - Afficher / masquer les numros de ligne

    Code : Console - Afficher / masquer les numros de ligne

    On a demand couper partir du 3me caractre (soit la lettre "j" vu que la premire lettre correspond au caractre n0).On a volontairement omis le second paramtre facultatif, ce qui fait que du coup substr() a renvoy tous les caractres restants avant lafin de la chane. Essayons de renseigner le paramtre facultatif pour ne pas prendre le point d'exclamation par exemple :

    Code : C++ - Afficher / masquer les numros de ligne

    chaine = "";1.

    string substr( size_type index, size_type num = npos );1.

    int main()1.

    {2. string chaine = "Bonjour !";3. cout

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    7 sur 8 23/08/2007 02:16

    Code : Console - Afficher / masquer les numros de ligne

    Bingo !

    On a demand prendre 4 caractres en partant du caractre n3, ce qui fait qu'on a rcupr "jour"

    La mthode c_str()

    Celle-l est un peu particulire, mais parfois fort utile. Son rle ? Retourner un pointeur vers le tableau de char que contient l'objet detype string.

    Quel intrt me direz-vous ? En C++, priori aucun intrt.Mais il peut (j'ai bien dit il "peut") arriver que vous deviez envoyer une fonction un tableau de char classique, faon C. Dans ce cas, lamthode c_str() vous permet de rcuprer un bon vieux tableau de char comme on faisait en C.

    Code : C++ - Afficher / masquer les numros de ligne

    Rcuprer le tableau de char vous sera utile si vous devez envoyer une chane une fonction la base prvue pour le C qui ne reconnatpas les string. C'est rare, mais a arrive. Je prfre que vous sachiez qu'on a cette possibilit pour pas que vous soyez btement bloqu un moment.

    Autant que possible, utilisez des objets de type string plutt que des tableaux de char : vous avez vu que c'tait bien plus facile

    utiliser

    Q.C.M.

    Qu'est-ce qu'une mthode ?

    nmlkj Une fonction contenue dans un objet

    nmlkj Une variable contenue dans un objet

    nmlkj Un type d'objet particulier

    Laquelle de ces dclarations d'un objet de type string est incorrecte ?

    nmlkj string chaine(Ma chaine);

    nmlkj string chaine = "Ma chaine";

    nmlkj string chaine("Ma chaine");

    Que vaudra maChaine aprs ces oprations ?

    Code : C++

    jour

    int main()1.

    {2. string chaine = "Bonjour !";3.

    const char* chaineC = NULL;4. 5. chaineC = chaine.c_str(); // On rcupre le tableau de char dans chaineC6. cout

  • La magie de la POO par l'exemple : string - Programmation - Lecture d... http://www.siteduzero.com/tuto-3-13435-1-la-magie-de-la-poo-par-l-e...

    8 sur 8 23/08/2007 02:16

    Auteur : M@teo21Noter et commenter ce tutorialImprimer ce tutorial

    nmlkj si fort

    nmlkj Ne criez pas

    nmlkj Ne criez pas si fort

    nmlkj Ne criez passi fort

    nmlkj (Rien du tout)

    Peut-on afficher un string l'aide d'un cout ?

    nmlkj Oui

    nmlkj Non

    nmlkj Oui, mais condition de le convertir en char* avec c_str()

    Que va afficher ce code ?

    Code : C++

    nmlkj Je suis un message

    nmlkj suis un message

    nmlkj un message

    Correction !

    Comme le disait si bien ma prof d'informatique "C'est plus confortable de travailler avec un string" (je vous jure que c'est vrai, j'tais l )

    Bon plus srieusement

    Vous avez dcouvert le ct utilisateur de la POO et quel point ces nouveaux mcanismes pouvaient vous simplifier la vie.

    Le ct utilisateur est en fait le ct simple de la POO. Les choses se compliquent lorsqu'on passe du ct crateur. Nous allons justement apprendre crer des objets dans le prochain chapitre et tous les suivants. Une longue route pleine de pripties nous

    attend

    string maChaine;maChaine = "Ne criez pas";maChaine += "si fort";

    string message("Je suis un message");cout