To see the basic idea, read the three pages [here].
#include <iostream.h>
main() {
int *A;
A = new int[10]; // allocate array of 10 integers and point A to it
if (! A) {
cerr << "Out of memory!\n" << endl;
exit(1);
}
for (int i = 0; i < 10; ++i)
A[i] = i;
int &B = A[3];
B = 999;
for (int i = 0; i < 10; ++i)
cout << "A[" << i << "] = " << A[i] << endl;
delete[] A;
}
Save this program as "tmp.cc", compile with "g++ -o tmp tmp.cc" and run the program. The output should be
A[0] = 0 A[1] = 1 A[2] = 2 A[3] = 999 A[4] = 4 A[5] = 5 A[6] = 6 A[7] = 7 A[8] = 8 A[9] = 9
// tmp2.cc
#include <iostream.h>
int &
max_ref(int &a, int &b) {
if (a > b) return a;
else return b;
}
main() {
int x = 3, y = 4;
max_ref(x,y) = 999;
cout << "x = " << x << ", y = " << y << endl;
}
Returning a reference is especially useful when implementing an array class, when you want to be able to do something like:
#include "Array.h"
main() {
Array<int> A;
A[3] = 10;
}
To implement operator[] for the Array class so that A[3] can be assigned to as in this example, the operator[] member function will have to return a reference.
When you use a function to return a reference, make sure that the reference you return is still valid outside the function. For example, the following routine returns a reference to a variable that ceases to be defined outside the scope of the function. This can get you into all kinds of trouble:
// tmp3.cc
#include <iostream.h>
int &
wrong() {
int a = 1;
return a;
}
main() {
wrong() = 10; // this causes "10" to be written into a deallocated memory cell
cout << wrong() << endl; // this prints the contents of a deallocated memory cell
}
The compiler will compile it, but may warn you about the problem:
% make -k tmp3 g++ tmp3.cc -o tmp3 tmp3.cc: In function `int& wrong()': tmp3.cc:6: warning: reference to local variable `a' returned
and running the program will give you unpredictable results. Note that the exact same issue occurs with pointers to variables.