Возврат функций ссылочных типов
Функции можно объявить, чтобы они возвращали ссылочный тип. Существует две причины создания такого объявления.
Возвращаемая информация представляет собой настолько крупный объект, что возврат ссылки кажется более эффективным, чем возврат копии.
Тип функции должен представлять собой l-значение.
Точно так же как передавать крупные объекты функциям эффективнее посредством ссылки, возможно, возвращать крупные объекты из функций также эффективнее с использованием ссылки. Протокол возврата ссылок устраняет необходимость копировать объект во временное хранилище перед возвратом.
Типы возврата ссылок также могут оказаться полезными, если результатом функции должно быть l-значение. Большинство перегруженных операторов относятся к этой категории, в частности оператор присваивания. Перегруженные операторы описаны в разделе Перегруженные операторы.
Пример
Рассмотрим пример Point.
// refType_function_returns.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Point
{
public:
// Define "accessor" functions as
// reference types.
unsigned& x();
unsigned& y();
private:
unsigned obj_x;
unsigned obj_y;
};
unsigned& Point :: x()
{
return obj_x;
}
unsigned& Point :: y()
{
return obj_y;
}
int main()
{
Point ThePoint;
// Use x() and y() as l-values.
ThePoint.x() = 7;
ThePoint.y() = 9;
// Use x() and y() as r-values.
cout << "x = " << ThePoint.x() << "\n"
<< "y = " << ThePoint.y() << "\n";
}
Вывод
x = 7
y = 9
Обратите внимание, что функции x и y объявляются как типы возвращаемых ссылок. Эти функции можно использовать на любой стороне оператора присваивания.
Объявления ссылочных типов должны содержать инициализаторы. Исключение составляют следующие случаи.
Явное объявление extern
Объявление члена класса
Объявление в классе
Объявление аргумента в адрес функции или возвращаемого типа для функции