Cerca nel sito:
ricerca
avanzata

Frasi Celebri...

Troppo caldo per andare in chiesa? E per andare all'inferno?

Anonimo 

Sondaggio:

Chi vorreste come pilota alla Ferrari?

Montoya
Trulli
Fisichella
Alesi
R.Schumacher
Villeneuve
Hakkinen
Coultard

visualizza risultati


 

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.

 

successivo
–«  INDICE  »–

 

 

 

 

 
Powered by paper&pencil (carta&matita ) - Copyright © 2001-2009 Cataldo Sasso