Partage
  • Partager sur Facebook
  • Partager sur Twitter

pointeurs, références, c++, java ???

Je veux comprendre !!!

Sujet résolu
    27 octobre 2010 à 22:22:52

    Bonjours à tous,
    je tiens à dire avant tout que je pose cette question en tant que gros débutant :D
    Alors voilà, après avoir acquis beaucoup de connaissances dans plusieurs langages dont le c et le c++ principalement, voilà que je me met au Java. :p
    Beaucoup de chose en commun se retrouve entre le c++ et le Java mis à part les pointeurs, référence. Oui il n'y en a pas, :D et c'est justement ma question.
    J'ai cru entendre dire sur internet(façon de parler) que tout objet en Java était considéré comme un pointeur(ou référence)? Est-ce vrai ?
    Bref je ne pose pas une question bien précise mais j'aimerais bien qu'on m'explique si cela est tout d'abord vrai et quels sont les différence au niveau des référence entre le Java et le c++?
    Et une autre question tout à fait à part :
    Y a t-il une différence entre l'opérateur new dans les deux langages(c++, java) car en c++, lorsque on utilise l'opérateur new pour instancier un objet on fait comme ceci :
    Test *test = new Test()
    

    et en Java :
    Test test = new Test()
    

    En c++, l'opérateur new retourne l'adresse de la mémoire alloué pour la taille d'un objet Test.(corriger moi si tout ce que ej dis est totalement faux) Et new retournant donc une adresse, celle ci est stocker dans le pointeur test(*test).
    Mais cela fonctionne t-il pareil en java ?(ou autrement dit, l'opérateur new fonctionne t-il pareil en Java ?).

    Bref, je ne vais pas vous écrire un roman mais se serait très sympa de m'éclairer sur tout cela.
    Merci beaucoup d'avance pour vos réponses. :D
    • Partager sur Facebook
    • Partager sur Twitter
      28 octobre 2010 à 1:28:33

      Disons que (pour resumer) le tuto Java réponds déjà pas mal a tes questions.
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai tous les badges d'OpenClassrooms.
        28 octobre 2010 à 10:03:58

        Considère que, en java, quand tu déclares une variable d'un type objet (donc non primitif), tu déclares en fait automatiquement un pointeur. Comme si tu avais:
        typedef Classe* Classe;
        Note bien qu'en java, on ne parle jamais de pointeur, mais de référence.

        Partant de cette affirmation, on retrouve de nombreux points communs faciles à expliquer :

        * Une référence java peut valoir null et c'est techniquement la même chose qu'un pointeur NULL en C/C++.

        * Déréférencer un pointeur NULL en C/C++, soit par accès à un membre soit par appel d'une méthode provoque une erreur de segmentation. En java, l'appel d'une méthode sur une référence qui vaut null provoque une NullPointerException. C'est la même chose, sauf que java est plus malin et intercepte l'erreur avant que la JVM ne crashe.

        * L'opérateur new fait la même chose des deux côtés: il retourne un pointeur respectivement une référence vers un nouvel objet alloué. (La façon d'allouer est en interne différente, mais on s'en fout ici)

        * IL n'y a pas d'équivalent à delete en java pour la simple et bonne raison que la libération de la mémoire est gérée par le garbage collector.

        * On peut considérer que toutes les méthodes java sont automatiquement virtuelles

        * Avec cette affirmation, on peut aussi facilement comprendre pourquoi les variables a et b du code ci-dessous font référence au même objet en mémoire (et qu'il n'y a donc pas deux objets distincts comme certains le croient encore) :
        MonObjet a = new MonObjet();
        MonObjet b = a;
        

        A mettre en relation avec :
        MonObjet* a = new MonObjet();
        MonObjet* b = a;
        


        Histoire de donner aussi mal à la tête aux experts, amusons-nous un peu. Je conseille aux débutants de ne pas ouvrir la partie secrète, pour leur santé mentale :

        string *a = new String("Hello world"), *b = new string("Hello world");
        printf( ((*a)==(*b))? "true" : "false");
        

        String a = new String("Hello world"), b = new String("Hello world");
        System.out.println(a==b);
        

        • Partager sur Facebook
        • Partager sur Twitter
          28 octobre 2010 à 10:26:56

          Et bien merci beaucoup QuentinC, tu à parfaitement répondu à ma (ou mes) question(s).
          Tout est plus clair maintenant dans ma tête. ;)
          Par contre lorsque tu a écrit cela :
          MonObjet a = new MonObjet();
          MonObjet b = a;
          
          Tu a bien dis que les deux objets font références vers le même objet en mémoire, mais alors comment faire en sorte que les deux objets soient deux différents et qu'il ne fassent donc pas référence vers le même objet en mémoire?
          Peut être faut-il faire comme ca :
          MonObjet a = new MonObjet();
          MonObjet b = new MonObjet(a);
          

          Corriger moi!!!


          Voilà, sinon merci encore de ta réponse au précédent post! :D

          PS: Et pour la boite secrète, je n'ai pas trop compris ou tu veux en venir :p
          • Partager sur Facebook
          • Partager sur Twitter
            28 octobre 2010 à 11:44:00

            Citation : loic001

            Tu a bien dis que les deux objets font références vers le même objet en mémoire, mais alors comment faire en sorte que les deux objets soient deux différents et qu'il ne fassent donc pas référence vers le même objet en mémoire?
            Peut être faut-il faire comme ca :

            MonObjet a = new MonObjet();
            MonObjet b = new MonObjet(a);
            


            Corriger moi!!!



            Oui ta méthode permet de creer 2 objets qui n'ont pas la même reférence, mais il faudrait dans ce cas creer un construteur de recopie (à la façon C++)

            Mais habituellement il y'a une méthode Clone() qui permet de cloner les objets et donc d'avoir 2 reférences différentes. Pour celà il faut que ton objet implémente l'interface Cloneable.
            • Partager sur Facebook
            • Partager sur Twitter
            J'ai tous les badges d'OpenClassrooms.
              28 octobre 2010 à 12:01:04

              IL n'y a pas de constructeur de copie automatique dans le sens C++. Ca n'existe pas en java.

              - Soit comme déjà dit il faut le créer toi-même: public MaClasse (MaClasse source) { ... }

              - Soit il faut implémenter l'interface Cloneable et la méthode public Object clone () qui lui correspond, car là non plus ça ne peut pas être automatique.

              ET pour ma partie secrète c'est pas grave, les fous comme moi ont compris.
              • Partager sur Facebook
              • Partager sur Twitter
                28 octobre 2010 à 13:24:11

                Citation : QuentinC 2

                ET pour ma partie secrète c'est pas grave, les fous comme moi ont compris.


                <hs>peut-tu enlever ça de la balise secret ? je suis sur IE6 et donc je ne peux pas dérouler cette balise ni voir son contenu, pourtant j'aimerais bien voir ce que tu as marqué à l'intérieur</hs>
                • Partager sur Facebook
                • Partager sur Twitter
                J'ai tous les badges d'OpenClassrooms.
                  30 octobre 2010 à 0:05:28

                  Il a écrit des choses que l'on n'écrit jamais en C++ pour jouer ensuite avec les diverses notions d'égalité et d'identité.
                  Seulement, en C++ on a la possibilité (pour ce pas dire qu'il est fortement recommandé de procéder de la sorte quand cela a du sens) de conférer une sémantique de valeur à nos objets (copiable, comparable). Ainsi, en vrai on manipule systématiquement les chaines via des wrappers RAIIsant qui apportent une sémantique de valeur -> std::string, et on fuit les new ici (en terme général, delete est également fui pour améliorer robustesse et simplicité -> RAII). Ce qui fait que le côté comparaison de trucs alloués après déférencement n'intervient jamais de la sorte (après un new qui tend à prendre la sémantique de valeur à rebrousse-poil)

                  Citation : OP

                  J'ai cru entendre dire sur internet(façon de parler) que tout objet en Java était considéré comme un pointeur(ou référence)? Est-ce vrai ?


                  En Java, tu ne peux pas manipuler un objet autrement que via une référence. Au final, tu as deux types de variables, celles de type primitif, et celles de type référence. Dans l'un comme dans l'autre cas, elles se passent toutes deux par copie. Ce qui fait que l'on ne peut pas écrire de swap qui va échanger deux entiers ou deux références. Au mieux, on pourra échanger le contenu (pointé par) de deux références, mais pas altérer les références.
                  D'où que certains insistent pour dire que les objets se manipulent uniquement au travers de variables de type référence vu que c'est plus exact.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                    30 octobre 2010 à 11:39:34

                    Bonjour, Willard tu vas m'excuser hein, mais je voudrais que tu me mettes les phrase qui définisse pointeur et référence dans le cour de JAVA.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 octobre 2010 à 12:05:08

                      Pointeur il n'y a pas à le définir puisque ça n'existe pas en java
                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 octobre 2010 à 12:29:41

                        Cela m'étonnerait que l'on puisse faire des référence sans pointeur.

                        tu veux plutôt dire que les pointeur ne sont pas accessible ! je pense non.

                        si il n'existe pas alors il y a un élément qui travaille comme eux.

                        sinon comment procède t-on pour l'adressage ?

                        j'ouvre un nouveau sujet dans discutions générales.

                        je trouve d'ailler que le sujet de Loic001 n'as pas été résolut et il l'est marqué comme.

                        http://www.siteduzero.com/forum-83-573 [...] reference.htm
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 octobre 2010 à 16:32:45

                          Ton lien n'est pas correct (404)

                          Techniquement parlant, c'est presque sûr que les pointeurs C++ et les références java reviennent à peu de chose près au même. Ca se montre assez bien avec les exemples que j'ai donné plus haut.
                          Comme pour les références de tous les autres langages qui masquent volontairement la notion de pointeur pour des raisons de simplicité. Que ce soit du C#, du python, du ruby, du php ou n'importe quoi d'autre. Fondamentalement, on manipule toujours un objet via un pointeur plus ou moins déguisé.

                          JE pense que là ou commence la vraie confusion de termes, c'est quand on parle de référence en C++ et quand on parle de référence dans le reste du monde.
                          Une référence C++ n'est pas une référence java, puisqu'une référence C++ ne peut pas valoir null et ne peut pas pointer autre chose que ce pour quoi elle a été initialisée. Perso j'aime pas utiliser les référence en C++, les pointeurs sont tellement plus logiques...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 octobre 2010 à 18:09:29

                            C'est ça le lien que vous cherchiez ? http://www.siteduzero.com/forum-83-573 [...] eference.html

                            PS: les références C++ sont des alias. Et on vient d'avoir droit à un mini troll au sujet de leur pertinence sur dvpz: http://www.developpez.net/forums/d9892 [...] nteurs-bruts/ Inutile de la reproduire sur un forum Java sur le sdz, non ?
                            PPS: avant le reste du petit monde que tu cites, il a très longtemps existé le monde qui parlait du passage d'"arguments par adresse" ou "par référence" (Pascal, Ada, ...). Donc non, le terme C++ n'est pas si mal choisi.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                              30 octobre 2010 à 18:36:04

                              Citation

                              PPS: avant le reste du petit monde que tu cites, il a très longtemps existé le monde qui parlait du passage d'"arguments par adresse" ou "par référence"
                              (Pascal, Ada, ...). Donc non, le terme C++ n'est pas si mal choisi.


                              Heu... tu peux en expliquer davantage ? je ne suis pas sûr de te suivre là.

                              Tu ne nvoulais pas parler plutôt de la distinction passage par valeur / passage par référence ? Auquel cas la seule différence entre le C/C++ et le java c'est qu'en java tu n'as pas le choix.

                              La différence qu'il y a entre passage par pointeur ou par référence en C++, c'est seulement du cosmétique. En assembleur ça reste de toute façon des pointeurs... c'est juste pour utiliser le point à la place de la flèche. Ca paraît plus friendly, mais en réalité ça n'apporte que de la confusion.
                              JE me rappelle avoir cherché des heurs pourquoi ce genre de code ne faisait pas ce que je voulais :
                              Truc& a = ... ;
                              Truc& b = ... ;
                              b = a;
                              

                              Je trouve ça complètement illogique...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 octobre 2010 à 18:59:43

                                Le terme pour passer des paramètres existe depuis bien longtemps. Le C++ l'a repris pour désigner l'artéfact qui permet justement, et autres choses, de passer des paramètres de la sorte. "référence" n'est pas un terme illogique en C++.

                                Ensuite, c'est bien plus que cosmétique car nous avons une certitude que l'on reçoit n'est pas nul. On rejoint des principes de la programmation par contrat -- car pour recevoir une truc nul, il faut que l'appelant l'ait vraiment fait exprès. Et ... cela correspond aux digressions du second fil dont j'ai donné le lien.
                                Plus que l'on ne pourrait pas écrire de constructeur de copie sans les références, certes qualifiées par abus de langage "constantes".

                                Enfin, récupérer une référence non constante en sortie de fonction, c'est prendre des risques, nulle surprise ici que le résultat ne fusse pas correct. Avec des pointeurs, le résultat eut été le même à réaliser une affectation après déréférencement.
                                C'est aussi un code smell vu qu'il y a très peu de fonctions où il est sain de récupérer une références non constante. Le seul type de lieu où ceci acceptable sans arriver à une vilaine rupture d'encapsulation, c'est dans les opérateurs d'accès à des éléments de tableaux et autres collections.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                  30 octobre 2010 à 19:44:50

                                  Bonjour à tous,
                                  J'ai récemment acheter un livre concernant le langage Java et il se trouve que la réponse à ma question était écrite noir sur blanc.
                                  Je remercie donc avant de fermer le post tout ceux qui ont gentiment répondu à ma question. (certain m'avait déjà répondu, mais c'est après avoir lu ce fameux livre, que j'ai pu comprendre ce qu'il voulait me dire au travers de leurs réponses)
                                  Pour ceux que ca intéresse, voici la réponse :

                                  Citation : Programmer en Java, Claude Delannoy

                                  En c++, la déclaration d'un objet entraîne toujours la réservation d'un emplacement approprié (comme pour un type de base), contrairement à Java qui réserve un emplacement pour un type primitif, mais seulement une référence pour un objet. En revanche, en c++, on peut instancier un objet de deux manière différentes : par sa déclaration (objet automatique) ou par l'opérateur new(objet dynamique). Dans ce dernier cas, on obtient en résultat une adresse qu'on manipule par le biais d'un pointeur, ce dernier jouant un peu le rôle de la référence de Java. Le fait que Java ne dispose que d'un seul mode d'instanciation (correspondant aux objets dynamiques de c++)contribue largement à la clarté des programmes.


                                  Voilà , en résumé, qu'en c++ il y à 2 mode d'instanciation, et en Java, un seul. Et celui de Java serait en faite celui du c++ utilisant l'opérateur new et un pointeur.
                                  En gros, ca :
                                  Objet *obj = new Objet()
                                  

                                  et pareil que :
                                  Objet obj = new Objet
                                  

                                  Bien sur, la seule différence est la syntaxe mais le reste fonctionnerait pareil.
                                  Donc voila :D
                                  En espérant avoir aider d'autre personnes même si certaines avait déjà compris tout cela sans trop savoir comment me l'expliquer. :p
                                  A bientôt à toute et à tous.


                                  PS: Je marque le sujet comme résolu.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 octobre 2010 à 21:09:01

                                    Citation

                                    En gros, ca :
                                    Code : C++
                                    Objet *obj = new Objet() 
                                    et pareil que :
                                    Code : Java
                                    Objet obj = new Objet 
                                    Bien sur, la seule différence est la syntaxe mais le reste fonctionnerait pareil.


                                    C'est ce que je disais tout au début.
                                    Quoique, il paraît que java 7 incluera un système permettant de créer des objets sur la pile quand il peut s'assurer qu'ils ne sont pas passés plus loin.

                                    Citation

                                    Le terme pour passer des paramètres existe depuis bien longtemps. Le C++ l'a repris pour désigner l'artéfact qui permet justement, et autres choses, de
                                    passer des paramètres de la sorte. "référence" n'est pas un terme illogique en C++.


                                    JE n'ai jamais dit que le terme de référence était illogique. J'ai juste dit que le terme référence n'avait pas la même signification en C++ qu'ailleurs, où dans les faits référence==pointeur. Démonstration dans ma première réponse, qui peut aussi s'appliquer à la plupart des langages objets modernes courants autres que C++ (java, C#, python, ruby, php...), et je dirais même le C si on peut admettre qu'on peut faire de la POO dans une certaine mesure.

                                    Ce que je trouve complètement illogique par contre, c'est que les références C++ agissent comme et sont interchangeables avec des pointeurs, mais que tout à coup, dans mon exemple, pouf ça fait une copie des données et non pas de l'objet pointé. Ca n'a aucun intérêt, concrètement.


                                    Citation

                                    Ensuite, c'est bien plus que cosmétique car nous avons une certitude que l'on reçoit n'est pas nul. On rejoint des principes de la programmation par contrat
                                    -- car pour recevoir une truc nul, il faut que l'appelant l'ait vraiment fait exprès. Et ... cela correspond aux digressions du second fil dont j'ai donné
                                    le lien.


                                    Pour la nullité, désolé, mais je trouve que c'est généralement une question de bon sens. ET le bon sens permet d'éviter d'ouvrir la doc toutes les 5 minutes pour vérifier.
                                    J'ai été emm**** dans un code perso une fois que j'avais bâti tout mon truc sur les références quand je me suis rendu compte que je devais renvoyer null quelque part. ET j'ai été contraint de faire un truc archi-moche du genre return *(Truc*)0 (ça ne plante que si on utilise la référence retournée)

                                    Citation

                                    Plus que l'on ne pourrait pas écrire de constructeur de copie sans les références, certes qualifiées par abus de langage "constantes".


                                    Je suis désolé mais le constructeur de copie c'est bien un truc que je n'utilise jamais ou pratiquement jamais en C++, sauf pour shared_ptr et string, et encore.
                                    Au pire si on n'en a vraiment besoin, on peut définir une méthode clone qui est tellement plus évidente à comprendre qu'un constructeur pas vraiment défini mais toujours présent et complètement abscons.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      30 octobre 2010 à 22:34:53

                                      Citation : Quentin C 2

                                      C'est ce que je disais tout au début.


                                      Tout à fait, tu l'avais déjà préciser mais je ne l'avait pas tout à fait compris et d'ailleurs désolé.
                                      Merci à toi encore une fois et désolé pour tout le temps que je t'ai fais perdre à écrire toute ces phrases. ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        31 octobre 2010 à 0:11:10

                                        Citation

                                        Tout à fait, tu l'avais déjà préciser mais je ne l'avait pas tout à fait compris et d'ailleurs désolé.
                                        Merci à toi encore une fois et désolé pour tout le temps que je t'ai fais perdre à écrire toute ces phrases.


                                        Pas de problème. Quand le débat est intéressant, ça fait plaisir de discuter. J'obtiens aussi ma part de réponses sur ce sujet grâce à lmghs, donc tout le monde est content.
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        pointeurs, références, c++, java ???

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown