IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Question de java-iste: Pourquoi un pointeur plutôt que rien?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de Teto45
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 145
    Par défaut Question de java-iste: Pourquoi un pointeur plutôt que rien?
    Bonjour!

    Je me permets de poser cette sempiternelle question car malheureusement jusqu'ici je n'ai personnellement toujours pas trouvé de réponse qui me convenait (faut dire que je suis un peu neuneu des fois...).

    Je tiens tout d'abord à préciser que j'ai appris la programmation orientée objet avec Java, qui est je pense (comme tout le monde ici?) un excellent langage d'apprentissage. Et j'en ai suffisamment fait pour que je puisse dire sans forfanterie que j'en fais ce que je veux. Or dans ce langage il n'y a pas de notion de pointeur.

    Le pointeur est donc quelque chose de nouveau pour moi. J'ai donc regardé pas mal de tutos, dont le livre de Bruce Eckel "Penser en c++" dispo en français sur ce site (merci!!), un support de cours par Henri Garreta (très bien) ainsi qu'un tuto dispo ici (les pointeurs de C et du C++, par CGI, très bien aussi). J'ai pas encore fini le bouquin d'Eckel, mais j'ai déjà dépassé le chapitre sur les pointeurs. J'ai lu les autres.
    Or malgré ma bonne (excellente je devrais dire) volonté, je n'ai toujours rien capté.
    J'ai très bien compris ce qu'est un pointeur (et par extension, une référence): C'est une adresse/variable particulière où l'on stocke l'adresse d'une autre variable.
    J'ai très bien compris aussi que cela permet, entre autres, de travailler sur la variable elle-même et non sur une copie quand on passe cette variable dans les paramètres d'une méthode. Je sais aussi qu'il peut s'avérer utile dans l'utilisation des tableaux.
    Toutefois, je me pose quelques questions:
    - Pour le passage de la variable dans les paramètres d'une méthode, il existe une méthode toute aussi efficace, le référencement. Exemple:
    void maMethode(int &a);
    L'utilisateur se contente d'utiliser cette méthode en mettant le nom de sa variable, et la méthode utilise automatiquement cette variable et non une copie. Alors pourquoi vouloir garder en mémoire des pointeurs, genre:
    int *maVar = a; // Why?
    Est-ce que cela permet au programme d'être plus rapide? Paske fondamentalement au lieu d'avoir une seule variable (a) on en a 2 (maVar, a). Ou bien cela permet d'accéder à certaines variables partout dans l'application, de n'importe quelle classe (mais dans ce cas, pourquoi ne pas rendre la variable statique, comme en Java?).
    - On peut avoir aussi un référencement de méthode dans un pointeur (je me trompe?). Là, dans ce cas je ne comprends pas pourquoi.

    Autre point plus délicat. J'ai déjà regardé certaines sources, pour voir ce que j'arrivais déjà à déchiffrer. Or j'ai vite remarqué une chose: les habitudes des programmeurs comptent beaucoup dans la manière et la fréquence d'utilisation des pointeurs. J'ai ainsi vu certaines choses étranges, comme des méthodes avec que des pointeurs, sauf une ou deux variables 'standard' alors que rien n'aurait empêché à priori d'utiliser des pointeurs à la place (le pointeur est une variable comme les autres...). Bref:
    - Si une bonne âme pouvait m'indiquer un bouquin/site/pdf/tuto (en français si possible) sur les bonnes habitudes à prendre pour programmer... Je sais que des choses existent ici, mais je voulais avoir aussi des conseils de pros/profs (si vous avez le temps). Car il existe pleins de tutos sur la programmation, mais des fois les exemples donnés ne sont pas écrits d'une manière élégante (pour ne pas dire à l'arrach'...) et je voudrais apprendre bien tout de suite. Car une fois que j'ai assimilé une méthode, en changer est beaucoup plus dur. Et je ne parle pas des tutos qui décrivent des exemples... pour ensuite expliquer que c'était juste pour être pédagogique mais qu'en fait dans la vraie vie on n'utiliserait pas de pointeur dans ce cas précis... Comment voulez-vous vous y retrouver dans ces conditions?
    - Si quelqu'un pouvait aussi m'expliquer en quelques lignes et phrases percutantes la philosophie et les règles de base pour utiliser ou non des pointeurs ce serait encore mieux, il aurait droit alors à ma reconnaissance éternelle.

    En tout cas, merci à ceux qui ont eu le courage de lire jusqu'au bout ma prose.
    Teto.

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par Teto45 Voir le message
    a- Je tiens tout d'abord à préciser que j'ai appris la programmation orientée objet avec Java, qui est je pense (comme tout le monde ici?) un excellent langage d'apprentissage.

    b- Et j'en ai suffisamment fait pour que je puisse dire sans forfanterie que j'en fais ce que je veux. Or dans ce langage il n'y a pas de notion de pointeur.

    c- J'ai très bien compris ce qu'est un pointeur (et par extension, une référence): C'est une adresse/variable particulière où l'on stocke l'adresse d'une autre variable.
    J'ai très bien compris aussi que cela permet, entre autres, de travailler sur la variable elle-même et non sur une copie quand on passe cette variable dans les paramètres d'une méthode. Je sais aussi qu'il peut s'avérer utile dans l'utilisation des tableaux.


    Toutefois, je me pose quelques questions:
    d- Pour le passage de la variable dans les paramètres d'une méthode, il existe une méthode toute aussi efficace, le référencement. Exemple:

    e- L'utilisateur se contente d'utiliser cette méthode en mettant le nom de sa variable, et la méthode utilise automatiquement cette variable et non une copie. Alors pourquoi vouloir garder en mémoire des pointeurs, genre:

    Est-ce que cela permet au programme d'être plus rapide? Paske fondamentalement au lieu d'avoir une seule variable (a) on en a 2 (maVar, a). Ou bien cela permet d'accéder à certaines variables partout dans l'application, de n'importe quelle classe (mais dans ce cas, pourquoi ne pas rendre la variable statique, comme en Java?).

    f- On peut avoir aussi un référencement de méthode dans un pointeur (je me trompe?). Là, dans ce cas je ne comprends pas pourquoi.

    g- Autre point plus délicat. J'ai déjà regardé certaines sources, pour voir ce que j'arrivais déjà à déchiffrer. Or j'ai vite remarqué une chose: les habitudes des programmeurs comptent beaucoup dans la manière et la fréquence d'utilisation des pointeurs. J'ai ainsi vu certaines choses étranges, comme des méthodes avec que des pointeurs, sauf une ou deux variables 'standard' alors que rien n'aurait empêché à priori d'utiliser des pointeurs à la place (le pointeur est une variable comme les autres...). Bref:

    h- Si une bonne âme pouvait m'indiquer un bouquin/site/pdf/tuto (en français si possible) sur les bonnes habitudes à prendre pour programmer... Je sais que des choses existent ici, mais je voulais avoir aussi des conseils de pros/profs (si vous avez le temps). Car il existe pleins de tutos sur la programmation, mais des fois les exemples donnés ne sont pas écrits d'une manière élégante (pour ne pas dire à l'arrach'...) et je voudrais apprendre bien tout de suite. Car une fois que j'ai assimilé une méthode, en changer est beaucoup plus dur. Et je ne parle pas des tutos qui décrivent des exemples... pour ensuite expliquer que c'était juste pour être pédagogique mais qu'en fait dans la vraie vie on n'utiliserait pas de pointeur dans ce cas précis... Comment voulez-vous vous y retrouver dans ces conditions?

    i- Si quelqu'un pouvait aussi m'expliquer en quelques lignes et phrases percutantes la philosophie et les règles de base pour utiliser ou non des pointeurs ce serait encore mieux, il aurait droit alors à ma reconnaissance éternelle.

    En tout cas, merci à ceux qui ont eu le courage de lire jusqu'au bout ma prose.
    Teto.
    a- Hum ... bouaif. J'avais découvert la POO avec TP5.5 et je l'avais apprise avec Eiffel. Java est gentil à côté. Mais ce n'est pas le lieu pour cela.

    b- Bien sûr que si. Vous appelez ça des "références" en Java. A quelques propriétés près, c'est pareil.

    c- oui

    d- Tu veux parler du passage par référence ?
    Dans les faits bassement techniques, c'est pareil. Seuls sizeof(T*) octets^Wbytes circulent sur la pile.
    Par contre avec la référence C++, on a une garantie de non-nullité. Pas besoin de if ou de assert derrière.
    Cela veut aussi dire qu'avec un pointeur, on peut simuler des paramètres optionnels en passant parfois des trucs nuls -- comme en Java, pointeur et référence-java, même combat.

    Sémantiquement, avec un pointeur, on peut décider de s'emparer de la responsabilité du paramètre. Avec une référence, on signale très clairement que ce serait une idée stupide.

    e- quoi ? Quel rapport avec les trucs statiques ?

    f- Il existe des pointeurs de fonctions et aussi des pointeurs de fonctions membres si c'est ça ta question.
    A quoi ça sert ? C'est une autre façon, plus ancienne de réaliser le pattern commande.
    C'est ce qui sert aussi de base à la définition de boost::function/std::tr1::function et futurement std::function.

    g- l'expérience a montré que les pointeurs ne sont pas trop nos amis. Cherche RAII dans la FAQ.
    De plus il y a plusieurs écoles de C++. En gros l'école historique qui vient du C, et l'école moderne qui essaie de s'en affranchir. Et plein de cas hybrides entre.

    h- la FAQ ?
    Sinon, AC++ si tu veux apprendre le C++.
    Et plein de choses intéressantes sur GOTW concernant les ressources en ligne.

    j- Une école, à laquelle je tends à adhérer, tend à dire de ne pas utiliser de pointeurs bruts dans le code métier. On va les réserver à des classes "bas-niveau" à tendance informaticiennes. Dans le code métier on préférera les conteneurs standards ou les pointeurs intelligents comme ceux à comptage de référence que sont boost::shared_ptr<>/std::tr1::shared_ptr<>, futurement std::shared_ptr<> (aussi std::unique_ptr<>, bientôt).
    La règle que je me suis gravée dans le marbre, c'est : ne jamais être responsable de plus d'une ressource brute (cela englobe aussi la mémoire) à la fois.
    Et par extension, j'expérimente le "jamais de new[]".


    PS: pour le code, on utilise la balise code et pas la balise quote. D'autant que la politique de citation de developpez est encore moins pratique que ce que l'on voit sur les autres forums phpBB. -> Cite mon message et tu verras que les citations de ton message que j'ai gardées auront disparues. D'où entre autres raisons l'indexation que j'utilise.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre Expert
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Par défaut
    En Java il n'y a pas de type pointeur parce que le langage décide pour toi :
    • soit c'est un type primitif et alors tu ne peux pas pointeur dessus, si tu veux quand même tu es obligé d'utiliser un tableau et de considérer l'index dans le tableau comme un pointeur
    • soit c'est un objet et alors c'est forcément une réference (un pointeur sécurisé)


    En C/C++ il n'y a pas une telle castration du système de type :
    • tu peux pointer sur des types primitifs
    • tu peux créer des tableaux d'enregistements (consécutifs en mémoire). il n'y aura pas de pointeur sur chacun de ces enregistements, tu pourras les parcourir en incrémentant un pointeur


    Le type pointeur est un opérateur/constructeur de type qui te rend la gestion de la mémoire que Java t'enlève au nom de la sécurité et du ramassage automatique.

    Comme le dit Luc Hermitte, un style recommandé consiste à coder en C++ un peu comme tu le ferais en Java, et à cacher les manipulations de pointeurs (pour le bas niveau et/ou la performance) dans des boites à outils réutilisables.

  4. #4
    Membre actif Avatar de Teto45
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 145
    Par défaut Bon, j'ai compris... ;-)
    Alors reprenons dans l'ordre:

    @Luc:
    - Désolé pour les quote, je savais pas. 'Ferai plus, promis.
    - a) Sans doute. Mais faut bien commencer par quelque chose, et vu la communauté pour Java, cela permet d'avancer vite quand on a besoin d'aide.
    - d) assert, keskecé? (inutile de me répondre, cf plus bas)
    - e) quand on déclare une variable ou une méthode static, elle n'est initialisée qu'une fois, comme en C++. Mais en Java, en plus, on peut l'appeler directement sans être obligé d'instancier la classe. Les constantes, par exemple sont déclarées public static final, et ainsi on peut demander -> float f = classe.PI; sans être obligé de faire classe c = new classe(); float f = c.PI;. Quel est le lien avec les pointeurs? heu il me semblait qu'ils permettaient d'accéder directement aux données aussi, mais heu beuarf..
    - f) pattern commande? (inutile de... etc)
    - g) ça, j'ai vu ce soir, en regardant d'autres questions sur le forum (incroyable le nombre qui concerne les pointeurs...)
    - h) Yes! mais ce que j'y avais lu ne m'avait pas trop emballé, mais c'est sans doute parce que je débute, je pense qu'avec un peu d'expérience ça ira mieux. GOTW ? Je viens de noter précieusement l'adresse. Merci!
    - j) Au vu des expériences rapportées sur différents forums, cela semble être une excellente règle de vie. J'adhère!

    @SpiceGuid
    En lisant des bouquins sur le Java, c'est ce que j'avais lu. Basically le java est un C++ simplifié, qui supprime tout ce qui donne des maux de tête dans la pratique du C++.

    @Tous
    Merci pour vos réponses circonstanciées zé adéquates.Ce que je vais faire, c'est approfondir et continuer mon apprentissage, je reviendrai éventuellement à la charge quand mon tour d'horizon sera fini et digéré...
    Le post est [résolu].

    Teto.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    e- Les pointeurs permettent de pointer vers n'importe quoi (ou presque). Statique de classe ou pas, peu importe. C'est orthogonal.

    d- Pour assert, cherche nos posts sur la programmation par contrat.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une variable membre statique peut être utilisée sans instance de la classe aussi en C++, tu sais...
    C'est juste que la syntaxe est sensiblement différente:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    float f = classe::PI;

    De plus, attention avec le new en C++: Il est facile d'avoir une fuite de mémoire quand on l'emploie ainsi "à la java".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre actif Avatar de Teto45
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 145
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Une variable membre statique peut être utilisée sans instance de la classe aussi en C++, tu sais...
    C'est juste que la syntaxe est sensiblement différente:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    float f = classe::PI;

    De plus, attention avec le new en C++: Il est facile d'avoir une fuite de mémoire quand on l'emploie ainsi "à la java".
    Je ne réponds que maintenant, car je voulais en apprendre plus sur le C++, maintenant c'est fait.
    - Oui, effectivement, le static exist aussi en C++.
    - Je plussoie sur les fuites de mémoire quand on l'emploie à la java. C'était l'avantage du garbage collector en java... pas besoin de se prendre la tête.

    Merci pour les infos.
    Teto.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2012, 11h31
  2. [Avis] Pourquoi GUI plutôt que JSP ?
    Par habasque dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 24/11/2006, 13h07
  3. Pourquoi faut-il utiliser des tables plutôt que des frames ?
    Par malicia_bm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 09/10/2006, 09h20
  4. Réponses: 1
    Dernier message: 09/07/2006, 23h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo