// reference.cpp - Calling functions: parameters passed by value, 
//                 pointer, reference.

#include <iostream>

// We implement the function swap that is supposed to exchange the 
// values of its two parameters. We do it three ways, one wrong and
// two right. In the "wrong way" the parameters are passed by
// value. In the first "right way" (the C way) parameters are passed
// by address (or pointer). In the second "right way" (the C++ way)
// parameters are passed by reference.

void wrongSwap(int x, int y){  // WRONG
// parameters are passed by value, hence the arguments will not change.
   int temp;

   temp = x;
   x = y;
   y = temp;
}

void pointerSwap(int *x, int *y){
// parameters are passed by address
   int temp;

   temp = *x;
   *x = *y;
   *y = temp;
}

void referenceSwap(int& x, int& y){
// parameters are passed by reference
   int temp;

   temp = x;
   x = y;
   y = temp;
}


void main(void){
   int a = 3;
   int b = 5;

   cout << "Initially: a = " << a << "  b = " << b << endl;
   wrongSwap(a, b);
   cout << "After wrongSwap: a = " << a << "  b = " << b << endl;
   pointerSwap(&a, &b);
   cout << "After pointerSwap: a = " << a << "  b = " << b << endl;
   referenceSwap(a, b);
   cout << "After referenceSwap: a = " << a << "  b = " << b << endl;
   // Notice that now a and b have again their original values since they 
   // have been swapped twice
}

/* The output of this program is

Initially: a = 3  b = 5
After wrongSwap: a = 3  b = 5
After pointerSwap: a = 5  b = 3
After referenceSwap: a = 3  b = 5
 */
