Übergabe der Argumente

C+ + kennt mehrere Varianten, wie einer Funktion die Argumente übergeben werden können: call-by-value, call-by-reference und call-by-pointer.

call-by-value (Wertübergabe)

Bei call-by-value (Wertübergabe) wird der Wert des Arguments in einen Speicherbereich kopiert, auf den die Funktion mittels Parametername zugreifen kann. Ein Werteparameter verhält sich wie eine lokale Variable, die „automatisch“ mit dem richtigen Wert initialisiert wird. Der Kopiervorgang kann bei Klassen (Thema eines späteren Kapitels) einen erheblichen Zeit- und Speicheraufwand bedeuten!

Beispiel

#include <iostream>
#include <conio.h>
 
using namespace std;
 
//Prototyp, Deklaration
int sumW(int x,int y);	//Parameterübergabe per Wert (Value)
 
int main(int argc, char** argv) {
	cout << "Hello World" << endl;
 
	int a=5,b=6,erg=0;
	cout << "Parameteruebergabe per Wert" << endl;
	erg=sumW(a, b);
	cout << "a: " << a <<endl; 
	cout << "b: " << b <<endl;
 
	getch();	
 
	return 0;
}
 
//Funktionendefinition - Parameterübergabe per Wert
int sumW(int x,int y){		
	x+=1; //x=x+1; x++; ++x;
	y+=1;
 
	cout << "x: " << x <<endl;
	cout << "y: " << y <<endl;
 
	return x+y;
}

Beispielhafte Speicherbelegung des Programms im Hauptspeicher:

VariableAdresseWert
a0x00015
b0x00056
..
..
x0x00a15 → 6
y0x00a56 → 7

Die Ausgabe des Programms ist:

Hello World
Parameteruebergabe per Wert
x: 6
y: 7
a: 5
b: 6

call-by-reference (Übergabe per Referenz)

Sollen die von einer Funktion vorgenommen Änderungen auch für das Hauptprogramm sichtbar sein, müssen in C sogenannte Zeiger verwendet werden. C+ + stellt ebenfalls Zeiger zur Verfügung. C+ + gibt Ihnen aber auch die Möglichkeit, diese Zeiger mittels Referenzen zu umgehen, was im alten C nicht möglich war. Beide sind jedoch noch Thema eines späteren Kapitels.

Im Gegensatz zu call-by-value wird bei call-by-reference die Speicheradresse des Arguments übergeben, also der Wert nicht kopiert. Änderungen der (Referenz-)Variable betreffen zwangsläufig auch die übergebene Variable selbst und bleiben nach dem Funktionsaufruf erhalten. Um call-by-reference anzuzeigen, wird der Operator & verwendet, wie Sie gleich im Beispiel sehen werden. Wird keine Änderung des Inhalts gewünscht, sollten Sie den Referenzparameter als const deklarieren, um so den Speicherbereich vor Änderungen zu schützen. Fehler, die sich aus der ungewollten Änderung des Inhaltes einer übergebenen Referenz ergeben, sind in der Regel schwer zu finden.

#include <iostream>
#include <conio.h>
 
using namespace std;
 
//Prototyp, Deklaration
int sumR(int &x,int &y);	//Parameterübergabe per Referenz (Reference)
 
 
int main(int argc, char** argv) {
	cout << "Hello World" << endl;
 
	cout << "Parameteruebergabe per Referenz" << endl;
	a=5,b=6,erg=0;
	erg=sumR(a, b);
	cout << "a: " << a <<endl; 
	cout << "b: " << b <<endl;	
 
 
	getch();	
 
	return 0;
}
 
//Funktionendefinition - Parameterübergabe per Referenz
int sumR(int &x,int &y){		
	x+=1; //x=x+1; x++; ++x;
	y+=1;
 
	cout << "x: " << x <<endl;
	cout << "y: " << y <<endl;
 
	return x+y;
}

Beispielhafte Speicherbelegung des Programms im Hauptspeicher:

VariableAdresseWert
x,a0x00015 → 6
y,b0x00056 → 7
.
.
.
.

Die Ausgabe des Programms ist:

Hello World
Parameteruebergabe per Referenz
x: 6
y: 7
a: 6
b: 7

call-by-pointer (Übergabe per Zeiger)

Wenn Sie einen Zeiger als Parameter an eine Funktion übergeben, können Sie den Wert an der übergebenen Adresse ändern.

#include <iostream>
#include <conio.h>
 
using namespace std;
 
//Prototyp, Deklaration
int sumZ(int *x,int *y);	//Parameterübergabe per Zeiger (Pointer)
 
int main(int argc, char** argv) {
	cout << "Hello World" << endl;
	cout << "Parameteruebergabe per Zeiger" << endl;
	a=5,b=6,erg=0;
	erg=sumZ(&a, &b);
	cout << "a: " << a <<endl; 
	cout << "b: " << b <<endl;		
 
	getch();	
 
	return 0;
}
 
 
//Funktionendefinition - Parameterübergabe per Zeiger
int sumZ(int *x,int *y){			
	*x+=1; //x=x+1; x++; ++x;
	*y+=1;
 
	cout << "x: " << *x <<endl;
	cout << "y: " << *y <<endl;
 
	return *x+*y;
}

Beispielhafte Speicherbelegung des Programms im Hauptspeicher:

VariableAdresseWert
a0x00015 → 6
b0x00056 → 7
.
.
*x0x00a10x0001
*y0x00a50x0005

Die Ausgabe des Programms ist:

Hello World
Parameteruebergabe per Zeiger
x: 6
y: 7
a: 6
b: 7