/****************************************************************
reference.cpp
    some examples illustrating reference types
****************************************************************/
#include <iostream>
using namespace std;


void times2(int i) { // pass by copy, no return value
    cout << "void times2(int i) before: " << i << endl;
    i *= 2;
    cout << "void times2(int i) after: " << i << endl;
}

/*
void times2(int& i) { // pass by reference, no return value
    cout << "void times2(int i) before: " << i << endl;
    i *= 2;
    cout << "void times2(int i) after: " << i << endl;
}
*/
/*
int times2(int i) { // pass by copy, return by copy
    cout << "int times2(int i) before: " << i << endl;
    i *= 2;
    cout << "int times2(int i) after: " << i << endl;
    return i;
}
*/
/*
int times2(int& i) { // pass by reference, return by copy
    cout << "int times2(int& i) before: " << i << endl;
    i *= 2;
    cout << "int times2(int& i) after: " << i << endl;
    return i;
}
*/
/*
//the following will NEVER compile
int& times2(int i) { // pass by copy, return by reference
    cout << "int& times2(int i) before: " << i << endl;
   i *= 2;
    cout << "int& times2(int i) after: " << i << endl;
    return i;
}
*/
/*
int& times2(int& i) { // pass by reference, return by reference
    cout << "int& times2(int& i) before: " << i << endl;
    i *= 2;
    cout << "int& times2(int& i) after: " << i << endl;
    return i;
}
*/

void main() {
    int test = 3;
    cout << "Before call: " << test << endl;
    //times2(test);
    //cout << "Result of call: " << times2(test) << endl;
    cout << "After call: " << test << endl;
}