RE:Devolver referencia constante
La mayor utilidad que he visto a devolver referencias es el poder encadenar operadores en una misma línea. Por ejemplo,
cout << "Hola" << "Adios" << 1 << endl;
es posible porque el método "cout operator<<()" devuelve una referencia a cout, con lo que al evaluar
cout << "Hola" el resultado es cout, siendo posible entonces poner detrás el << "Adios".
De otra forma no sería posible.
Pasa lo mismo con, por ejemplo
a = b + c + d + e;
cuando a,b,c,d y e son instancias de clases tuyas.
Otro motivo para devolver referencias es cuando quieres devolver un dato/clase de tamaño grande y quieres evitar la copia.
int funcion() { return a;} devuelve una copia de a
int &funcion() { return a;} devuelve el mismo a, sin hacer copia. Ganas velocidad si a fuera una estructura muy grande.
Lo de const es para impedir que desde fuera modifiquen el dato que has devuelto, que puede ser interno de la clase.
Se bueno.