Mit unserem aktuellen Wissen ist es etwas umständlich, eine Variable mit Hilfe einer Funktion zu aktualisieren. Jedes Argument einer Funktion wird wie eine Kopie behandelt und verändert den ursprünglichen Wert nicht. Je nach Größe deines Typs kann das ernste Folgen für die Performance deines Codes haben.
int adjust_salary(int base, int kids) {
return base + kids * 500;
}
int now_a_mother_of_twins{2500};
adjust_salary(now_a_mother_of_twins, 2);
// now_a_mother_of_twins is still 2500
now_a_mother_of_twins = adjust_salary(now_a_mother_of_twins, 2);
// now_a_mother_of_twins is now 3500
References kann man als Aliase betrachten: Änderungen daran wirken sich auf die ursprüngliche Variable aus.
References verwenden ein Ampersand (&) in der Typdeklaration.
int balance{1000};
int& budget{balance};
int pro_computer_wheels{699};
budget -= pro_computer_wheels;
// budget is now 301;
// balance is also 301;
Ein Neusetzen (das Ändern der Bindung einer reference) ist nicht möglich.
Du kannst keine nicht initialisierte reference haben.
References müssen mit einer existierenden Variable initialisiert werden.
int main_acc{1'000'000};
int side_acc{-20};
int& savings{main_acc};
// => main_acc and savings are 1'000'000
// try to reseat savings to use main account
savings = side_acc;
// savings and main_acc are now -20
// as this uses the **value** of side_acc
savings += 20;
// savings and main_acc are now 0, side_acc is still -20
int& future_budget;
// => compiler error, reference must be bound!
voidMit der Macht der references musst du vielleicht gar keinen Wert aus einer Funktion zurückgeben.
In diesem Szenario wird void als Rückgabetyp verwendet.
void increase_power(int& level) {
level += 500;
}
int goku{8700};
increase_power(goku);
// goku's power level?
// It's over 9000!
Eine Schule in deiner Nähe hat eine sehr aktive Schülervereinigung. Die Schülervereinigung wird von einem Präsidenten geleitet, und alle zwei Jahre findet eine Wahl statt, um einen neuen Präsidenten zu wählen.
Bei der diesjährigen Wahl wurde entschieden, dass ein neues digitales System zum Auszählen der Stimmen gebraucht wird. Die Schule braucht deine Hilfe, um dieses neue System zu bauen.
ElectionResult
Das neue System braucht eine Möglichkeit, die Anzahl der Stimmen aus einem Zähler zu ermitteln.
Das Struct für das Wahlergebnis ist bereits für dich erstellt und ist so definiert:
struct ElectionResult {
// Name of the candidate
std::string name{};
// Number of votes the candidate has
int votes{};
};
Da alle Mitglieder im struct öffentlich sind, musst du keinen constructor schreiben, um ein ElectionResult-Objekt zu initialisieren.
Stattdessen kannst du eine initializer list verwenden:
ElectionResult hamilton{"Alex", 1804};
// => the hamilton object was initialized with the name "Alex" and 1804 votes.
Erstelle eine Funktion vote_count, die eine Referenz auf ein ElectionResult als Argument entgegennimmt und die Anzahl der Stimmen im ElectionResult zurückgibt.
vote_count(hamilton);
// => 1804
ElectionResult
Endlich ist es Zeit, die Stimmen auszuzählen!
Jetzt brauchst du eine Möglichkeit, die Stimmen in einem ElectionResult zu erhöhen.
Erstelle eine void-Funktion increment_vote_count, die eine Referenz auf ein ElectionResult und eine Anzahl von Stimmen als Argumente entgegennimmt und das ElectionResult um diese Anzahl von Stimmen erhöht.
ElectionResult burr{"Aaron " 1801};
increment_vote_count(burr, 3);
vote_count(burr);
// => 1804
Die Schule hat ihre Stimmen abgegeben, und jetzt ist es Zeit, die Ergebnisse zu prüfen, um den Gewinner zu ermitteln.
Erstelle eine Funktion determine_result, die eine Referenz auf ein Endergebnis entgegennimmt und eine Referenz auf das ElectionResult des neuen Präsidenten zurückgibt.
Sie soll außerdem den Namen des Gewinners ändern, indem sie ihm "President" voranstellt.
Das Endergebnis wird in Form einer reference auf std::vector<ElectionResult> übergeben, einem Vektor mit den ElectionResults aller teilnehmenden Kandidaten.
ElectionResult sanchez{"Pedro", 471};
ElectionResult wheatley{"Summer", 340};
std::vector<ElectionResult> final_count{sanchez, wheatley};
ElectionResult& winner = determine_result(final_count);
winner.name;
// => "President Pedro"
Um es einfach zu halten, kannst du Folgendes annehmen:
vector hat mindestens ein Element.Melde dich bei Exercism an, um C++ mit 19 Konzepte100 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.