Overloading di Operatori per Puntatori

Riguardo l’operatore di deferenziamento occorre precisare che si tratta di una cosa completamente differente dall’operatore di conversione a puntatore, infatti il primo ha la forma:

class T
{
T& operator *() const;
};

mentre il secondo:

class T
{
operator T*() const;
};

Ora vediamo un esempio per l’overloading dell’operatore “->” che serve per accedere agli attributi o metodi di una classe attraverso un puntatore.

// File Corso.h

class CMyPunto
{
public:
   int x, y;

   CMyPunto(int x0, int y0) { x = x0; y = y0; };

   int operator->();

   void Stampa();
};

// File Corso.cpp

#include <iostream>
#include "Corso.h"

using namespace std;

void CMyPunto::Stampa()
{
   cout << "X: " << x << endl;
   cout << "Y: " << y << endl;
   cout << endl;
}

int CMyPunto::operator->()
{
   return x + 10;
}

int main(int argc, char** args)
{
   int k;

   CMyPunto pt(5, 12);

   pt.Stampa();
   cout << "X: " << pt.operator->() << endl;

   cin >> k;

   return 0;
}

In questo semplice esempio si capisce perché questo operatore viene declassato da operatore binario ad unario suffisso, di solito viene utilizzato per creare i puntatori intelligenti, quindi avere oggetti che si comportano come puntatori.
La ridefinizione dell’operatore “[]” che ricordo serve per accedere ai singoli elementi di un array ed anche ovviamente per modificarne un valore. Normalmente l’operatore “[]” viene ridefinito in modo che ritorni un reference ad un valore contenuto nella struttura dati, cioé un l-value ed un argomento inserito per reference in modo che si possa fare anche la modifica di un valore per indice.

// File Corso.h

class CMyPunti
{
public:
   int k[3];

   CMyPunti(int x, int y, int z) { k[0] = x; k[1] = y; k[2] = z; };

   int& operator[](const int& i);

   void Stampa();
};

// File Corso.cpp

#include <iostream>
#include "Corso.h"

using namespace std;

void CMyPunti::Stampa()
{
   cout << "X: " << k[0] << endl;
   cout << "Y: " << k[1] << endl;
   cout << "Z: " << k[2] << endl;
   cout << endl;
}

int& CMyPunti::operator [](const int &i)
{
   return k[i];
}

int main(int argc, char** args)
{
   int k;

   CMyPunti pts(18, 14, 20);
   pts.Stampa();

   pts[1] = 25;
   cout << "Nuovo valore Y: " << pts[1] << endl;

   cout << endl;
   pts.Stampa();

   cin >> k;

   return 0;
}

In un prossimo articolo vedremo l’overloading degli operatori new e delete per l’allocazione e disallocazione della memoria.

<< Overloding degli operatori in C++

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in VC/C++. Contrassegna il permalink.