[C/C++] Surcharge d'opérateurs

lucyhle Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
J'ai des trous de mémoires de de compétences sur la surcharge d'opérateur.
A quoi ca sert?

Par exemple ici: pourquoi surcharge t'on les opérateur -> et * ?



Fichier CPtr.h


#if !defined __CPTR_H__
#define __CPTR_H__

namespace std
{
template <typename T> // Pourquoi ne met on pas template <class T> Quelle est la différence?
class CPtr
{
protected :
T * m_Ptr;
public :
CPtr (void);
~CPtr (void);

T & operator * (void) throw ();
const T & operator * (void) const throw (); // non obligatoire??
T * operator -> (void) throw ();
const T * operator -> (void) const throw (); // non obligatoire??

private
CPtr & operator = (const CPtr & Ptr);
CPtr (const CPtr & Ptr);

}; // CPtr

} // namespace std

#include "CPtr.hxx"

#endif /* __CPTR_H__ */



Fichier CPtr.cxx

#if !defined __CPTR_HXX__
#define __CPTR_HXX__

#include "CPtr.h"

#define TEMPL template <class T> // class ou typename?
#define TEMPLINL TEMPL inline
#define CPTR std::CPtr <T>

TEMPLINL CPTR:: CPtr (void) { m_Ptr = new T(); }

TEMPLINL CPTR::~CPtr (void) { delete m_Ptr; }

TEMPLINL
T & CPTR::operator * (void) throw () { return *m_Ptr; }
TEMPLINL
const T & CPTR::operator * (void) const throw () { return *m_Ptr; }

TEMPLINL
T * CPTR::operator -> (void) throw () { return m_Ptr; }

TEMPLINL
const T * CPTR::operator -> (void) const throw () { return m_Ptr; }

#undef CPTR
#undef TEMPLINL
#undef TEMPL

#endif /* __CPTR_HXX__ */


Merci pour votre aide, j'ai rajouté quelques autres questions qui me trotter dans la tête...

1 réponse

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Je ne savait même pas que ces opérateurs était surchargeable.
C'est pourtant simple.
Tu as une class CPtr, si tu considère la code suivant :
CPtr ptr<double>,*pptr;
*ptr=2.3; //n'as de sens que si l'opérateur * unaire a été surchargé.
ptr->=\0x00000;// tu manipule directement le pointeur
*pptr=ptr;//assignation de class classique.
Du moins, c'est comme ça que je le comprends.
Je n'ai jamais compris non plus la différence entre class ou typename, pour moi, c'est pareil, si il y a une différence, elle est subtil.
0