[C++] Overload operatore []
Salve, avrei due domande su questo codice circa l'overload dell'operatore [inline][][/inline]:
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]?
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
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?
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?
"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]?
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.
Se è vero che:
Posso dire che i reference, essendo alias di variabili, anch'essi possono essere sia lvalue che rvalue?
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?
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).