CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Surcharge d'opérateurs

Grisam
Grisam
Niveau 8
05 juin 2013 à 22:03:31

Bonsoir,

J'ai fais ma L1 maths/info cette année, j'ai surtout fait du Java cette année, beaucoup d'UML, le polymorphisme, le typage dynamique, l'héritage et d'autres trucs de conception orienté objet en Java

Puis là je suis en vacances et j'essaye de m'initier au C++ car cela m'intéresse (en plus ça tombe bien parce que j'en aurais en L2 l'année prochaine), du coup j'essaye d'apprendre à partir du Site du Zero, j'ai vu pas mal de fois des personnes dire que developpez.com était mieux pour ça, mais je n'ai trouvé que des tutoriels sur des thématiques très précises, mais je n'ai pas trouvé de tutoriels qui englobe le langage dans sa relative globalité,( ce qui est préférable si on ne veut pas se risquer à voir les notions dans ordre incohérent )

Là pour les surcharges d'opérateurs, j'ai à peu près compris le principe, mais là je suis face à quelque chose que je ne comprends pas

__

Les fichiers veulent bien compiler mais :

1) Il s'agit de la fonction ( tout en bas de ZFraction.cpp ):

ZFraction operator+(ZFraction const& fr1, ZFraction const& fr2)

Lorsque je fais :

ZFraction res(fr1); // Là, si j'ai bien compris "res", vas seulement "pointer" vers la même référence que "fr1"

Lorsque je fais ensuite :

res += fr1; // l'objet pointé par l'objet "res" vas être modifier à partir de la méthode "operator+=" alors qu'il est sensé être en lecture seule (const&) non ?

___________

:globe: Fichiers :

ZFraction.cpp : http://pastebin.com/UeE1CC2p

ZFraction.h : http://pastebin.com/FyaYmaiH

_____________

Merci pour vos futures réponses

PS: Si vous avez des tutos cool sur le C++ (ou encore mieux : des tutos du style "Du Java au C++", ou des trucs comme ça, j'ai cherché j'ai pas trouvé, donc je suis preneur si vous en connaissez, parce que je trouve que celui sur le Site du Zero est parfois flou, surtout sur l'allocation dynamique en C++ qui est apparemment différent qu'en Java puisqu'il y a la notion de pointeurs

Mon but étant de pouvoir utiliser de façon correct la librairie OpenGL en C++, afin de pouvoir faire en sorte d'afficher des fichiers de polygone 3D, du style WaveFront OBJ .obj avec le fichier .mtl pour les coordonnées de textures, ou des .3ds ou des fichiers VRML .wrl, mais pour ça, je pense qu'il faut que je maitrise un minimum correctement le C++

Merci

godrik
godrik
Niveau 30
05 juin 2013 à 22:26:30

Lorsque tu fais "ZFraction res(fr1);" tu cree un objet res sur la pile et le construit en faisant une copie de fr1.

Sinon, pour une reference sur le C++: http://cpp.developpez.com/cours/cpp/

vive_cod4
vive_cod4
Niveau 9
05 juin 2013 à 22:30:26

Salut !

Quand tu fais

ZFraction res(fr1) cela va appeler le constructeur par recopie ! Pour te convaincre tu peux faire :

std::cout << &fr1 << std::endl;
std::cout << &res << std::endl;

Donc en gros l'objet res contient une copie de fr1, le compilateur va faire une copie superficielle et puisque tu as que des variables qui ne sont pas des pointeurs, le nouveau objet aura les variables avec la même valeur (s'il y avait des pointeurs les pointeurs auraient les mêmes adresses et dans ce cas il est fortement conseillé de redéfinir le constructeur par recopie).

Pour continuer tu rajoutes fr2 à ton objet res que tu retournes. Voilà

Pour conclure : fr1 est toujours une constante, tu ne l'as pas modifié et tout le monde est content

Grisam
Grisam
Niveau 8
05 juin 2013 à 23:00:09

Parce qu'en Java

Quand on fait par exemple

import package.ZFraction;

public class Test{
public static void main(String[] args){

ZFraction res = new ZFraction(); // Là on instancie un nouvel objet en mémoire

ZFraction res2 = res; // Là on instancie rien du tout, res2 est juste un autre moyen pour accéder à l'objet instancié précedemment

}
}

Donc, pour moi là on aurait juste un seul objet, avec "res2" et "res" qui pointent vers le même objet

Contrairement à si on avait utilisé le constructeur par copie :

public ZFraction(ZFraction fr){

m_num = fr.m_num;
m_den = fr.m_den;
}

Puis ensuite dans le main :

ZFraction res2 = new ZFraction(res);

Là ouais, il y aurait eu 2 nouvelles instanciations, donc deux objets

____________

C'est pour ça que là je comprends pas pourquoi en C++

En faisant :

ZFraction res(fr1);

on a une nouvelle instance, enfin, qu'on créé un nouvel objet ayant une adresse mémoire différente

Sinon oui vive_code4 j'arrive à peu près à faire l'analogie avec le Java, avec la copie de surface et la copie profonde

Quand on a des attributs qui sont des objets

Pour un constructeur par copie de surface, deux objets pourront avoir un attribut ayant la même adresse mémoire ce qui peut être embêtant, alors qu'avec un constructeur par copie profonde, on instancie un nouvel objet pour l'attribut en question

Sinon godrik, je sais pas trop ce que c'est les piles/files etc, j'ai vu ça dans des cours, mais je me disais que je verrais ça plus tard

En tout cas, merci beaucoup pour vos réponses :oui:

vive_cod4
vive_cod4
Niveau 9
05 juin 2013 à 23:47:21

Enfaite faut juste savoir que java et c++ ne fonctionnent pas de la même manière.

En java si tu fais

ZFraction f1 = f2 cela va copier la référence (l'adresse de f2 dans f1) donc f1 sera = f2 (à tous les niveaux).

En c++ cela va appeler le constructeur par recopie. Mais sache que si tu fais qqch du genre :

ZFraction* z1 = new ZFraction(1,2);
ZFraction* z2 = z1 alors z1=z2, comme dans le cas en java. Cela va en effecter copier l'adresse de z1 dans z2

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment