begin process at 2012 05 30 04:38:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

surcharge d'opérateurs


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

surcharge d'opérateurs

dimanche 24 octobre 2010 à 22:32:50 | surcharge d'opérateurs

dyroj

Bonjour,

En apprenant un cour sur le langage c++ je suis arriver au surcharge d'opérateurs. Je pence avoir compris le fonctionnement mais il y a quelque chose qui me dérange, c'est la référence utiliser dans la fonction :
Objet operator+(const Objet &monObjet);
Donc ma question est la suivante, pourquoi utiliser une référence en l'occurrence &monObjet et pas un simple objet par exemple :
Objet operator+(const Objet monObjet);
J'ai d’ailleurs testé et cela fonctionne normalement.

Au revoir.
lundi 25 octobre 2010 à 10:23:30 | Re : surcharge d'opérateurs

CptPingu

Administrateur CodeS-SourceS
Utiliser une référence évite la copie inutile de l'objet :)
(Gain de performance)

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
lundi 25 octobre 2010 à 10:34:47 | Re : surcharge d'opérateurs

dyroj

Ha OK mais c'est quoi la différence entre une copie et une référence? Sa a un rapport avec la mémoire ou autre?
lundi 25 octobre 2010 à 10:41:21 | Re : surcharge d'opérateurs

CptPingu

Administrateur CodeS-SourceS
Exemple:

Code C/C++ :
void swap(int a, int b)
{
  int tmp = a;
  a = b;
  b = tmp;
}


Ce code passe a et b par copie. Donc a et b seront échangé localement. Ce ne sont pas les valeurs directement.
Donc si tu fais:
Code C/C++ :
int x = 5;
int y = 8;
swap(x, y);
std::cout << x << " " << y << std::endl;


x et y ne seront pas inversé. Car une copie de x et de y, ont été inversé.

Alors qu'avec ce code, tout fonctionnera bien:
Code C/C++ :
void swap(int& a, int& b)
{
  int tmp = a;
  a = b;
  b = tmp;
}


Si tu ne comprends pas pourquoi ça fonctionne, c'est que tu maîtrise vraisemblablement mal les pointeurs et la mémoire.
Je t'invite à bien approfondir ce sujet, en faisant par exemple du C, avant de te mettre au C++.

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
lundi 25 octobre 2010 à 10:52:56 | Re : surcharge d'opérateurs

dyroj

Sauf que dans la fonction opérateur on ne modifi pas la référence car c'est une constante :
Objet operator+(const Objet &monObjet);
et donc :
void swap(const int& a,const int& b)
{
int tmp = a;
a = b;
b = tmp;
}

Erreur de compilation.
lundi 25 octobre 2010 à 11:02:21 | Re : surcharge d'opérateurs

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Mon exemple t'expliquais la passage par référence et non la constitude.

Quand on veut passer par référence, on prend le risque de voir sa variable être modifié. Donc on passe par copie pour éviter cela.
Parfois (et même souvent), passer par copie peut être très couteux en performance.

Donc on se retrouve avec le dilemme: performance/sécurité.

Le "const truc&" permet d'avoir le beurre et l'argent du beurre. Non seulement on va pouvoir passer par référence (et donc éviter une couteuse copie) mais en plus, grâce au "const", on est sur que la variable ne sera pas modifiée par l'appel à la fonction.

C'est extrêmement utilisé en C++.

Ex:
Code C/C++ :
// copie inutile de str
void affiche(std::string str)
{
  std::cout << str << std::endl;
}

// const est ici inutile, puisque str est passé de tout façon par copie.
// + copie inutile de str
void affiche(const std::string str)
{
  std::cout << str << std::endl;
}

// Ici, pas de copie. Mais on prend le risque de voir str être modifié.
void affiche(std::string& str)
{
  str = "toto"; // str peut être modifié. Or pour une fonction d'affichage, ça devrait être impossible
  std::cout << str << std::endl;
}

// Version parfaite :). Pas de copie inutile, pas de risque de modification de str
void affiche(const std::string& str)
{
  std::cout << str << std::endl;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
lundi 25 octobre 2010 à 11:08:51 | Re : surcharge d'opérateurs

dyroj

OK je te remercie pour ton aide.
Au revoir.


Cette discussion est classée dans : objet, référence, opérateurs, monobjet, surcharge


Répondre à ce message

Sujets en rapport avec ce message

objet qui retourne une valeur (if (monObjet)) ?? [ par Bub325 ] Bonjour, Je cherche à faire retourner une valeur à mon objet pour pouvoir l'utiliser dans les if par exemple si c'est possible:Exemple:class objet{... Surcharge des Opérateurs ? [ par MichelAliasMiB ] Bonjour, Dans le cadre d'un cours de C++, je dois faire unexercice pour comprendre la surcharge des opérateurs. J'ai un bouquin qui traite du sujet, m surcharge des opérateurs [ par gmisof ] comment on peut utiliser la commande operator de vc++?gmisof Surcharge de l'operateur [] => erreur avec un objet créé dynamiquement [ par julien_boss ] Bonjour,j'ai une classe LogFile, dans laquelle j'ai surchargé l'operateur [] pour qu'il renvoit un ENREGISTREMENT (structure perso).Je fais ceci : Log Surcharge d'opérateurs [ par minet03 ] Salut les amis, Je voulais savoir si c'étais possible de faire des surcharge d'opérateurs sans utiliser les classes ? C'est pour faire des calculs sur passage d 'un objet par référence en const : discard qualifiers [ par Yossi ] Bonjour, je fais un passage par référence d'un objet dans nue méthode d'une classe, et je fais un appel à une méthode de l'objet passé en référence. PETITE QUESTION : Objet, pointeur ou référence???? [ par eupeup ] Bonjour à tous, j'ai une petite question, et si quelqu'un pouvait me répondre se serait sympa... Donc en fait j'ai une classe contenant diverse chos Surcharge des opérateurs [ par pinkettee ] Bonjour les amis, j'ai un petit problème à propos de la surcharge des opérateurs J'ai deux classes qui sont : class Cellule{ double note ; }; class c++ -> objet -> dll ->Excel [ par outferdine ] Bonjour Pour commencer je vient de créer un classe de pricing des options européenne avec visual studio c++ 2010 et j'ai arrivé à acceder aux fonction traitement d'image [ par witon ] bonjour, je vous expose mon problème, j'ai un projet de "vision" j'utilise la bibliothèque OpenCV.. j' ai extraite les contours d'un objet (dans mon i


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales