Reference parameters

Lesstof © 2002-2003, Joost Ronkes Agerbeek

Omschrijving

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.

[ Naar boven | Terug naar Lesstof ]

Voorbeeld

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;
}
	
[ Naar boven | Terug naar Lesstof ]

Zie ook

[ Naar boven | Terug naar Lesstof ]

Valid XHTML 1.0! Correct CSS! Laatst bijgewerkt: dinsdag 15 april 2014