Voici la classe Person que je vais utiliser :

#ifndef _PERSON_H
#define _PERSON_H
 
#include <string>
 
using namespace std;
 
class Person
{
public:
    inline Person(string name, string firstName) : _name(name), _firstName(firstName) {}
 
    inline string getName() const { return _name; }
    inline void setName(string name) { _name = name; }
    inline string getFirstName() const { return _firstName; }
    inline void setFirstName(string firstName) { _firstName = firstName; }
 
private:
    string _name;
    string _firstName;
};
 
#endif

L'idée est de pouvoir afficher une instance Person dans le flux de sortie standard (la console par défaut) en faisant ceci :

Person p("tabin", "cedric");
cout << p << endl;

Mais cela ne passera pas la compilation : g++ sort l'erreur suivante :

error: no match for ‘operator<<’ in ‘std::cout << p’

Il est possible d'essayer la même variante avec un pointeur :

Person* p = new Person();
cout << p << endl;
delete p;

La compilation va passer sans problème. Par contre, le texte affiché sera simplement l'adresse mémoire du pointeur (un truc genre 0x804b1c8), ce qui ne sert pas à grand chose.

Pour contourner cela, la méthode est assez simple : elle consiste à surcharger l'opérateur << pour qu'il puisse afficher l'objet en question. Afin de faciliter la chose, on peut surcharger l'opérateur pour qu'il traite un pointeur ou une référence à une instance Person :

ostream& operator<<(ostream& o, Person* p)
{
    o << p->getName() << " " << p->getFirstName();
    return o;
}
 
ostream& operator<<(ostream& o, Person& p)
{
    o << p.getName() << " " << p.getFirstName();
    return o;
}

Et le tour est joué !