[C++] Overload operatore []

robe921
Salve, avrei due domande su questo codice circa l'overload dell'operatore [inline][][/inline]:
class Lista
{
  private:
    int m_list[10];
 
  public:
    int& operator[] (const int index);
};
 
int& Lista::operator[] (const int index)
{
  return m_list[index];
}

int main()
{
   Lista list;
   list[2] = 3;
   std::cout << list[2];
 
   return 0;
}

1) Perché si passa come argomento alla funzione [inline]operator[]()[/inline] un [inline]const int[/inline]?
2) Potreste spiegarmi perché la riga di codice [inline]std::cout << list[2][/inline] stampa il valore allocato in quella posizione se il tipo di ritorno è [inline]int&[/inline]?

Risposte
vict85
1) Perché il professore voleva esplicitare che quel valore rimaneva costante. Non è però necessario e non modifica il codice generato per quella particolare funzione. Insomma è più che altro una scelta estetica.
2) Il tipo di ritorno è un reference ad un intero, e i reference sono trattati come elementi del loro tipo base (al contrario dei puntatori). Quindi non capisco il tuo dubbio. Sai cosa sono i reference?

robe921
"vict85":
2) Il tipo di ritorno è un reference ad un intero, e i reference sono trattati come elementi del loro tipo base (al contrario dei puntatori). Quindi non capisco il tuo dubbio. Sai cosa sono i reference?

A quanto ho capito sono "alias" di variabili. In altre parole, se ho un [inline]int[/inline] allocato in memoria, a cui viene associata la variabile [inline]a[/inline] (es. [inline]int a = 5[/inline]), posso considerare tale variabile come un'"etichetta" . Effettuando l'assegnazione [inline]int& ref = a[/inline], non faccio altro che creare una seconda "etichetta" per l'intero allocato, in modo da avere [inline]cout << ref; // *stampa 5*[/inline]. Ho inteso bene?

Se sono elementi del loro tipo base, allora perché sono usati come lvalue nell'assegnazione [inline]list[2] = 3[/inline]?

vict85
Di fatto sono puntatori costanti, non nulli con notazioni più comode da usare. Insomma è come se la funzione ritornasse [inline]int * const[/inline] e l'operatore di valutazione fosse implicito.

robe921
Se è vero che:
a = 5; // a è un lvalue
std::cout << a; // a è un rvalue

Posso dire che i reference, essendo alias di variabili, anch'essi possono essere sia lvalue che rvalue?

Super Squirrel
1) Perché si passa come argomento alla funzione operator[]() un const int?


"const" fa in modo che la variabile associata non possa essere modificata. Oltre a darci l'informazione quindi, ci mette anche al riparo da eventuali problemi legati ad una modifica non voluta della variabile.
Inoltre una volta che dichiari la variabile const tanto vale passarla by reference in modo da risparmiare memoria.

Se è vero che:
CODICE:
a = 5; // a è un lvalue
std::cout << a; // a è un rvalue

Posso dire che i reference, essendo alias di variabili, anch'essi possono essere sia lvalue che rvalue?


Esatto. Per quanto riguarda le funzioni, se il tipo di ritorno è int, la funzione può essere utilizzata solo come r-value, invece se il tipo di ritorno è int&, la funzione può essere utilizzata sia come r-value che come l-value (cosa che nel caso dell'overload dell'operatore [] può essere molto utile).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.