Я думаю, что ваш вопрос на самом деле два вопроса:
- Каковы последствия возврата константы.
- Каковы последствия возврата ссылки.
Чтобы дать вам лучший ответ, я объясню немного больше об обеих концепциях.
Относительно ключевого слова const
Ключевое слово const означает, что объект нельзя изменить до этой переменной, например:
MyObject *o1 = new MyObject;
const MyObject *o2 = o1;
o1->set(...); // Will work and will change the instance variables.
o2->set(...); // Won't compile.
Теперь ключевое слово const можно использовать в трех различных контекстах:
- Завершение вызывающего метода, что вы не будете изменять объект
Например:
void func(const MyObject &o);
void func(const MyObject *o);
В обоих случаях любые изменения, внесенные в объект, останутся вне области действия функции, поэтому, используя ключевое слово const, я заверяю вызывающую функцию, что не буду изменять его переменные экземпляра.
- Заверение компилятора в том, что определенный метод не изменяет объект
Если у вас есть класс и некоторые методы, которые «получают» или «получают» информацию из переменных экземпляра без их изменения, тогда я смогу использовать их, даже если используется ключевое слово const. Например:
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.
}
- Наконец, (ваш случай) возвращает постоянное значение
Это означает, что возвращаемый объект не может быть изменен или изменен напрямую. Например:
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.
}
Дополнительная информация о ключевом слове const: C ++ Faq Lite - Const Correctness
Относительно ссылок
Возврат или получение ссылки означает, что объект не будет продублирован. Это означает, что любое изменение, внесенное в само значение, будет отражено за пределами области действия функции. Например:
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
Таким образом, возвращение эталонного значения означает, что значение можно изменить, например:
class Foo
{
public:
...
int &val() { return m_val; }
private:
int m_val;
};
Foo f;
f.val() = 4; // Will change m_val.
Дополнительная информация о ссылках: C ++ Faq Lite - Семантика ссылок и значений
Теперь, отвечая на ваши вопросы
const int exampleOne();
Означает, что возвращаемый объект не может изменяться через переменную. Это более полезно при возврате объектов.
int& exampleTwo();
Означает, что возвращаемый объект такой же, как и внутри функции, и любое изменение, внесенное в этот объект, будет отражено внутри функции .
const int& exampleThree();
Означает, что возвращаемый объект такой же, как и внутри функции, и не может быть изменен с помощью этой переменной.