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.
Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…
MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→
In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…
In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…
Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…
Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→