Nieuws — Lesstof — Pengo — Projecten — Console API — Links
Lesstof © 2002-2003, Joost Ronkes Agerbeek
Normaal gesproken maakt C++ een kopie van parameters die je meegeeft aan een functie. Dat betekent dat wijzigingen in de parameter niet behouden blijven voor de aanroepende functie. Dit principe heet pass-by-value.
In sommige gevallen wil je juist wel dat de wijzigingen behouden blijven, bijvoorbeeld als de functie een vijand verplaatst. Om aan te geven dat C++ geen kopie moet maken, maar de doorgegeven parameter zelf moet gebruiken, maak je gebruik van een reference parameter. Dit doe je door een ampersand (&) achter het datatype van de parameter te zetten. Dit principe heet pass-by-reference.
Het volgende voorbeeld laat het verschil zien tussen pass-by-value en pass-by-reference. Merk op dat de code van de functies SortByValue en SortByReference exact hetzelfde is.
#include <iostream>
using namespace std;
// Sorteert drie getallen. Na aanroep moet de eerste parameter het grootste
// getal bevatten, de tweede parameter het middelste getal en de derde parameter
// het kleinste getal. Deze functie maakt gebruik van pass-by-value (en werkt
// daardoor niet goed).
void SortByValue(int number1, int number2, int number3)
{
cout << "\nSortByValue is aangeroepen met de volgende waarden.\n";
cout << "number1: " << number1 << endl;
cout << "number2: " << number2 << endl;
cout << "number3: " << number3 << endl;
// sorteer de getallen (het doet er even niet zoveel toe hoe het sorteren
// gedaan wordt)
int myHighest, myMiddle, mySmallest;
myHighest = (number1 > number2) ? number1 : number2;
myHighest = (myHighest > number3) ? myHighest : number3;
mySmallest = (number1 < number2) ? number1 : number2;
mySmallest = (mySmallest < number3) ? mySmallest : number3;
myMiddle = number1 + number2 + number3;
myMiddle -= myHighest + mySmallest;
number1 = myHighest;
number2 = myMiddle;
number3 = mySmallest;
// klaar met sorteren
cout << "\nSortByValue is klaar met sorteren. De parameters hebben nu de ";
cout << "volgende waarden (we zitten nog steeds in de functie).\n";
cout << "number1: " << number1 << endl;
cout << "number2: " << number2 << endl;
cout << "number3: " << number3 << endl;
}
// Sorteert drie getallen. Na aanroep moet de eerste parameter het grootste
// getal bevatten, de tweede parameter het middelste getal en de derde parameter
// het kleinste getal. Deze functie maakt gebruik van pass-by-reference.
void SortByReference(int& number1, int& number2, int& number3)
{
cout << "\nSortByReference is aangeroepen met de volgende waarden.\n";
cout << "number1: " << number1 << endl;
cout << "number2: " << number2 << endl;
cout << "number3: " << number3 << endl;
// sorteer de getallen (het doet er even niet zoveel toe hoe het sorteren
// gedaan wordt)
int myHighest, myMiddle, mySmallest;
myHighest = (number1 > number2) ? number1 : number2;
myHighest = (myHighest > number3) ? myHighest : number3;
mySmallest = (number1 < number2) ? number1 : number2;
mySmallest = (mySmallest < number3) ? mySmallest : number3;
myMiddle = number1 + number2 + number3;
myMiddle -= myHighest + mySmallest;
number1 = myHighest;
number2 = myMiddle;
number3 = mySmallest;
// klaar met sorteren
cout << "\nSortByReference is klaar met sorteren. De parameters hebben nu ";
cout << "de volgende waarden (we zitten nog steeds in de functie).\n";
cout << "number1: " << number1 << endl;
cout << "number2: " << number2 << endl;
cout << "number3: " << number3 << endl;
}
// Het programma start hier.
void main()
{
// stel drie testgetallen in
int myTest1, myTest2, myTest3;
myTest1 = 10;
myTest2 = 22;
myTest3 = 8;
// sorteer de getallen met SortByValue
SortByValue(myTest1, myTest2, myTest3);
cout << "\nNa aanroep van SortByValue hebben de testgetallen de volgende ";
cout << "waarden.\n";
cout << "myTest1: " << myTest1 << endl;
cout << "myTest2: " << myTest2 << endl;
cout << "myTest3: " << myTest3 << endl;
// sorteer de getallen met SortByReference
SortByReference(myTest1, myTest2, myTest3);
cout << "\nNa aanroep van SortByReference hebben de testgetallen de ";
cout << "volgende waarden.\n";
cout << "myTest1: " << myTest1 << endl;
cout << "myTest2: " << myTest2 << endl;
cout << "myTest3: " << myTest3 << endl;
}