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; }