Retornos da função de tipo de referência
As funções podem ser declaradas para retornar um tipo de referência. Há duas razões para fazer tal declaração:
As informações retornadas são um objeto tão grande que retornar uma referência é mais eficiente do que retornar uma cópia.
O tipo da função deve ser um l-value.
Assim como pode ser mais eficiente passar objetos grandes para as funções por referência, também pode ser mais eficiente retornar objetos grandes das funções por referência. O protocolo de retorno de referência elimina a necessidade de copiar o objeto em um local temporário antes de retornar.
Os tipos de retorno de referência também podem ser úteis quando a função deve ser avaliada como um l-value. A maioria dos operadores sobrecarregados entra nessa categoria, particularmente o operador de atribuição. Os operadores sobrecarregados são abordados em Operadores sobrecarregados.
Exemplo
Considere o exemplo de 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";
}
Saída
x = 7
y = 9
Observe que as funções x e y são declaradas como tipos de referência de retorno. Essas funções podem ser usadas em ambos os lados de uma instrução de atribuição.
As declarações de tipos de referência devem conter inicializadores, exceto nos seguintes casos:
Declaração extern explícita
Declaração de um membro de classe
Declaração em uma classe
Declaração de um argumento para uma função ou o tipo de retorno para uma função