Creo que su pregunta es en realidad dos preguntas:
- ¿Cuáles son las implicaciones de devolver un const
- ¿Cuáles son las implicaciones de devolver una referencia
Para darle una mejor respuesta, voy a explicar un poco más.. sobre ambos conceptos.
Con respecto a la palabra clave const
La palabra clave const significa que el objeto no puede ser modificado través de esa variable, por ejemplo:
MyObject *o1 = new MyObject;
const MyObject *o2 = o1;
o1->set(...); // Will work and will change the instance variables.
o2->set(...); // Won't compile.
Ahora, la palabra clave const se puede utilizar en tres diferente contextos:
- Asegurando el persona que llama de un método que no modificará el objeto
Por ejemplo:
void func(const MyObject &o);
void func(const MyObject *o);
En ambos casos, cualquier modificación realizada en el objeto permanecerá fuera del ámbito de la función, es por eso que el uso de la palabra clave Const le aseguro a la persona que llama que no voy a modificar sus variables de instancia.
- Asegurando al compilador que un método específico no mutar el objeto
Si usted tiene una clase y algunos métodos que "entiende" o "obtiene" la información de las variables de instancia sin modificarlos, a continuación, Debería poder usarlos incluso si se usa la palabra clave const.Por ejemplo:
class MyObject
{
...
public:
void setValue(int);
int getValue() const; // The const at the end is the key
};
void funct(const MyObject &o)
{
int val = o.getValue(); // Will compile.
a.setValue(val); // Won't compile.
}
- último, (su caso) devolver un valor const
Esto significa que el objeto devuelto no puede ser modificado o mutado directamente. Por ejemplo:
const MyObject func();
void func2()
{
int val = func()->getValue(); // Will compile.
func()->setValue(val); // Won't compile.
MyObject o1 = func(); // Won't compile.
MyObject o2 = const_cast<MyObject>(func()); // Will compile.
}
Más información sobre la palabra clave const: C++ Faq Lite - Const Correctness
En cuanto a las referencias
de vuelta o que reciben una referencia significa que el objeto no se duplicará. Esto significa que cualquier cambio realizado en el valor en sí se reflejará fuera del alcance de la función. Por ejemplo:
void swap(int &x, int &y)
{
int z = x;
x = y;
y = z;
}
int a = 2; b = 3;
swap(a, b); // a IS THE SAME AS x inside the swap function
Así, devolviendo un valor de referencia significa que el valor se puede cambiar, por ejemplo:
class Foo
{
public:
...
int &val() { return m_val; }
private:
int m_val;
};
Foo f;
f.val() = 4; // Will change m_val.
Más información acerca de referencias: C++ Faq Lite - Reference and value semantics
Ahora, respondiendo a sus preguntas
const int exampleOne();
Significa que el objeto devuelto no puede cambiar a través de la variable. Es más útil cuando devuelves objetos.
int& exampleTwo();
significa que el objeto devuelto es el mismo que el de dentro de la función y cualquier cambio realizado a ese objeto se reflejada dentro de la función.
const int& exampleThree();
significa que el objeto devuelto es el mismo que el de dentro de la función y no se puede modificar a través de esa variable.
Guau, la edición de rebajas realmente jodió aquí ... Yo no No sé cómo solucionarlo sin quitar los puntos. – aib
Allí, reemplacé el formato de viñetas con los caracteres de viñetas reales (•). Creo que se ve mejor, pero puede retroceder. – aib
Gracias a todos por el esfuerzo para responder la pregunta, pero esa respuesta acaba de llegar al punto. – user96815