Parameter und Argumente
Unsere Funktionen bisher tun bei jedem Aufruf genau dasselbe. Um aber die Fläche eines beliebigen Rechtecks zu berechnen, muss die Funktion seine Breite und Höhe kennen. Solche Werte bekommen Funktionen über Parameter:
#include <iostream>
#include <string>
void stelleVor(std::string name) {
std::cout << "Ich heiße " << name << "." << std::endl;
}
int main() {
stelleVor("Anna");
stelleVor("Max");
}Dieses Programm gibt aus:
Ich heiße Anna.
Ich heiße Max.In der Definition ist std::string name in den Klammern ein Parameter: eine Variable, die die Funktion in ihrem Rumpf verwenden kann. Wie bei anderen Variablen schreibst du ihren Datentyp und ihren Namen, nur ohne Semikolon. Im Aufruf ist der Wert in den Klammern, "Anna", ein Argument. Beim Aufruf der Funktion wird das Argument im Parameter gespeichert, und dann läuft der Rumpf. Beim ersten Aufruf ist name gleich "Anna", beim zweiten gleich "Max".
Diese zwei Wörter verwechselt man leicht, merke dir also: Ein Parameter ist eine Variable in der Definition, ein Argument ist ein Wert im Aufruf.
Eine Funktion kann mehrere Parameter haben, durch Kommas getrennt. Jeder Parameter hat seinen eigenen Datentyp, auch wenn die Typen gleich sind: int a, int b, nicht int a, b. Die Argumente gehen der Reihe nach in die Parameter: das erste Argument in den ersten Parameter, das zweite in den zweiten und so weiter:
#include <iostream>
#include <string>
void stelleVor(std::string name, int alter) {
std::cout << "Ich heiße " << name << " und bin " << alter << " Jahre alt." << std::endl;
}
int main() {
stelleVor("Anna", 21);
stelleVor("Max", 17);
}Dieses Programm gibt aus:
Ich heiße Anna und bin 21 Jahre alt.
Ich heiße Max und bin 17 Jahre alt.C++ prüft, ob die Argumente zu den Parametern passen. Jeder Parameter braucht sein Argument. Schreibst du in diesem Programm nur stelleVor("Anna");, lässt es sich nicht kompilieren:
main.cpp:9:5: error: no matching function for call to 'stelleVor'
9 | stelleVor("Anna");
| ^~~~~~~~~
main.cpp:4:6: note: candidate function not viable: requires 2 arguments, but 1 was provided
4 | void stelleVor(std::string name, int alter) {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.Die erste Zeile des Fehlers sagt, dass der Compiler keine Funktion stelleVor gefunden hat, die er so aufrufen könnte. Die Zeile mit note erklärt, warum: Die Funktion braucht 2 Argumente, hat aber nur 1 bekommen.
Einen ähnlichen Fehler bekommst du, wenn du die Argumente vertauschst. Der Aufruf stelleVor(21, "Anna") würde eine Zahl in name legen, dessen Typ std::string ist, deshalb steht in der Note unter dem Fehler no known conversion from 'int' to 'std::string' (eine Zahl lässt sich nicht in Text umwandeln). Haben aber zwei Parameter denselben Typ, kann der Compiler die Vertauschung nicht bemerken, und die Funktion arbeitet einfach mit den vertauschten Werten. Prüfe also immer die Reihenfolge deiner Argumente.
Jetzt können wir das Problem vom Anfang der Lektion lösen: eine Funktion, die die Fläche eines beliebigen Rechtecks ausgibt.
So schreibst du es:
Anweisungen
- 1
Erstelle über
maineine FunktiongibFlaecheAusmit zwei Parametern vom Typint,breiteundhoehe. Gib in ihrem Rumpfbreite * hoeheaus. - 2
Rufe sie in
mainmit den Argumenten5und6auf. Das Programm gibt30aus. - 3
Rufe
gibFlaecheAusnoch zweimal auf, für die anderen beiden Rechtecke vom Anfang der Lektion: mit den Argumenten10und5und dann1und5. Das Programm gibt dann30,50und5aus, genau wie das lange Programm am Anfang, aber jetzt braucht jedes Rechteck nur eine Zeile.