L'operatore di sottoscrizione
Un altro operatore un po' particolare e` quello di sottoscrizione [
] . Si tratta di un operatore binario il cui primo operando e` l'argomento
che appare a sinistra di [ , mentre il secondo e` quello
che si trova tra le parentesi quadre. La semantica classica associata a questo
operatore prevede che il primo argomento sia un puntatore, mentre il secondo
argomento deve essere un intero senza segno. Il risultato dell'espressione Arg1[Arg2]
e` dato da *(Arg1+Arg2) cioe` il valore contenuto all'indirizzo
Arg1+Arg2 . Questo operatore puo` essere ridefinito unicamente come
funzione membro non statica e ovviamente non e` tenuto a sottostare al significato
classico dell'operatore fornito dal linguaggio. Il problema principale che si
riscontra nella definizione di questo operatore e` fare in modo che sia possibile
utilizzare indici multipli, ovvero poter scrivere Arg1[Arg2][Arg3] ;
il trucco per riuscire in cio` consiste semplicemente nel restituire un riferimento
al tipo di Arg1 , ovvero seguire il seguente prototipo:
X& X::operator[](T Arg2);
dove T puo` essere anche un riferimento o un puntatore.
Restituendo un riferimento l'espressione Arg1[Arg2][Arg3] viene
tradotta in Arg1.operator[](Arg2).operator[](Arg3) .
Il seguente codice mostra un esempio di overloading di questo operatore:
class TArray {
public:
TArray(unsigned int Size);
~TArray();
int operator[](unsigned int Index);
private:
int* Array;
unsigned int ArraySize;
};
TArray::TArray(unsigned int Size) {
ArraySize = Size;
Array = new int[Size];
}
TArray::~TArray() {
delete[] Array;
}
int TArray::operator[](unsigned int Index) {
if (Index < Size) return Array[Index];
else /* Errore */
}
Si tratta di una classe che incapsula il concetto di array per effettuare dei
controlli sull'indice, evitando cosi` accessi fuori limite. La gestione della
situazione di errore e` stata appositamente omessa, vedremo meglio come gestire
queste situazioni quando parleremo di eccezioni.
Notate che l'operatore di sottoscrizione restituisce un int e non
e` pertanto possibile usare indicizzazioni multiple, d'altronde la classe e`
stata concepita unicamente per realizzare array monodimensionali di interi;
una soluzione migliore, piu` flessibile e generale avrebbe richiesto l'uso dei
template che saranno argomento del successivo capitolo.
|