|
Smart pointer
Un operatore particolarmente interessante e` quello di dereferenzazione ->
il cui comportamento e` un po' difficile da capire.
Se T e` una classe che ridefinisce -> (l'operatore
di dereferenzazione deve essere un funzione membro non statica) e Obj
e` una istanza di tale classe, l'espressione
Obj -> Field;
e` valutata come
(Obj.operator ->()) -> Field;
Conseguenza di cio` e` che il risultato di questo operatore deve essere uno
tra
- un puntatore ad una struttura o una classe che contiene un membro
Field;
- una istanza di un'altra classe che ridefinisce a sua volta l'operatore.
In questo caso l'operatore viene applicato ricorsivamente all'oggetto ottenuto
prima, fino a quando non si ricade nel caso precedente;
In questo modo e` possibile realizzare puntatori intelligenti (smart
pointer), capaci di eseguire controlli per prevenire errori disastrosi.
Pur essendo un operatore unario postfisso, il modo in cui viene trattato impone
che ci sia sul lato destro una specie di secondo operando; se volete potete
pensare che l'operatore predefinito sia in realta` un operatore binario il cui
secondo argomento e` il nome del campo di una struttura, mentre l'operatore
che l'utente puo` ridefinire deve essere unario.
|