Retornando valores por referência em C ++

Um programa C ++ pode ser mais fácil de ler e manter usando referências em vez de ponteiros. Uma função C ++ pode retornar uma referência de maneira semelhante, pois retorna um ponteiro.

Quando uma função retorna uma referência, ela retorna um ponteiro implícito para seu valor de retorno. Dessa forma, uma função pode ser usada no lado esquerdo de uma instrução de atribuição. Por exemplo, considere este programa simples -

#include <iostream>
#include <ctime>
 
using namespace std;
 
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
 
double& setValues( int i ) {
   return vals[i];   // return a reference to the ith element
}
 
// main function to call above defined function.
int main () {
 
   cout << "Value before change" << endl;
   for ( int i = 0; i < 5; i++ ) {
      cout << "vals[" << i << "] = ";
      cout << vals[i] << endl;
   }
 
   setValues(1) = 20.23; // change 2nd element
   setValues(3) = 70.8;  // change 4th element
 
   cout << "Value after change" << endl;
   for ( int i = 0; i < 5; i++ ) {
      cout << "vals[" << i << "] = ";
      cout << vals[i] << endl;
   }
   return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Value before change
vals[0] = 10.1
vals[1] = 12.6
vals[2] = 33.1
vals[3] = 24.1
vals[4] = 50
Value after change
vals[0] = 10.1
vals[1] = 20.23
vals[2] = 33.1
vals[3] = 70.8
vals[4] = 50

Ao retornar uma referência, tome cuidado para que o objeto ao qual está se referindo não saia do escopo. Portanto, não é legal retornar uma referência ao var local. Mas você sempre pode retornar uma referência em uma variável estática.

int& func() {
   int q;
   //! return q; // Compile time error
   static int x;
   return x;     // Safe, x lives outside this scope
}