Με τις γνώσεις που έχουμε μέχρι τώρα, είναι λίγο άβολο να ενημερώνεις μια μεταβλητή με τη βοήθεια μιας συνάρτησης. Κάθε όρισμα συνάρτησης αντιμετωπίζεται σαν αντίγραφο και δεν αλλάζει την αρχική τιμή. Ανάλογα με το μέγεθος του τύπου σου, αυτό μπορεί να έχει σοβαρές συνέπειες στην απόδοση του κώδικα σου.
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 μπορούν να θεωρηθούν ψευδώνυμα: οι αλλαγές πάνω τους επηρεάζουν την αρχική μεταβλητή.
Οι References χρησιμοποιούν ένα ampersand (&) στη δήλωση τύπου.
int balance{1000};
int& budget{balance};
int pro_computer_wheels{699};
budget -= pro_computer_wheels;
// budget is now 301;
// balance is also 301;
Η επανατοποθέτηση (η αλλαγή της δέσμευσης μιας reference) δεν είναι δυνατή.
Δε μπορείς να έχεις μια reference που δεν έχει αρχικοποιηθεί.
Οι References πρέπει να αρχικοποιούνται με μια υπάρχουσα μεταβλητή.
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!
voidΜε τη δύναμη των references μπορεί να μη χρειάζεται να επιστρέψεις καθόλου μια τιμή από μια συνάρτηση.
Σε αυτή την περίπτωση, το void χρησιμοποιείται ως τύπος επιστροφής.
void increase_power(int& level) {
level += 500;
}
int goku{8700};
increase_power(goku);
// goku's power level?
// It's over 9000!
Ένα τοπικό σχολείο κοντά σου έχει έναν πολύ δραστήριο σύλλογο μαθητών. Ο σύλλογος μαθητών διοικείται από έναν πρόεδρο και κάθε 2 χρόνια διεξάγονται εκλογές για την ανάδειξη νέου προέδρου.
Στις φετινές εκλογές, αποφασίστηκε ότι χρειαζόταν ένα νέο ψηφιακό σύστημα για την καταμέτρηση των ψήφων. Το σχολείο χρειάζεται τη βοήθειά σου για να φτιάξει αυτό το νέο σύστημα.
ElectionResult
Το νέο σύστημα θα χρειαστεί έναν τρόπο να παίρνει τον αριθμό των ψήφων από έναν μετρητή.
Το struct του εκλογικού αποτελέσματος έχει ήδη δημιουργηθεί για σένα και ορίζεται ως εξής:
struct ElectionResult {
// Name of the candidate
std::string name{};
// Number of votes the candidate has
int votes{};
};
Εφόσον όλα τα μέλη στο struct είναι public, δεν χρειάζεται να γράψεις έναν constructor για να αρχικοποιήσεις ένα αντικείμενο ElectionResult.
Μπορείς να χρησιμοποιήσεις αντ' αυτού μια initializer list:
ElectionResult hamilton{"Alex", 1804};
// => the hamilton object was initialized with the name "Alex" and 1804 votes.
Δημιούργησε μια συνάρτηση vote_count που θα παίρνει ως όρισμα μια αναφορά σε ένα ElectionResult και θα επιστρέφει τον αριθμό των ψήφων στο ElectionResult.
vote_count(hamilton);
// => 1804
ElectionResult
Ήρθε επιτέλους η ώρα να επεξεργαστούμε τις ψήφους!
Τώρα χρειάζεσαι έναν τρόπο να αυξάνεις τις ψήφους σε ένα ElectionResult.
Δημιούργησε μια συνάρτηση void increment_vote_count που θα παίρνει ως ορίσματα μια αναφορά σε ένα ElectionResult και έναν αριθμό ψήφων, και θα αυξάνει το ElectionResult κατά αυτόν τον αριθμό ψήφων.
ElectionResult burr{"Aaron " 1801};
increment_vote_count(burr, 3);
vote_count(burr);
// => 1804
Το σχολείο παρέδωσε τις ψήφους του και τώρα είναι ώρα να ελέγξεις τα αποτελέσματα για τον νικητή.
Δημιούργησε μια συνάρτηση determine_result που παίρνει μια αναφορά σε μια τελική καταμέτρηση και επιστρέφει μια αναφορά στο ElectionResult του νέου προέδρου.
Θα πρέπει επίσης να αλλάζει το όνομα του νικητή, προσθέτοντάς του ως πρόθεμα το "President".
Η τελική καταμέτρηση δίνεται με τη μορφή μιας reference προς std::vector<ElectionResult>, ένα vector με τα ElectionResults όλων των υποψηφίων που συμμετείχαν.
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"
Για να κρατήσουμε τα πράγματα απλά, μπορείς να υποθέσεις τα εξής:
vector έχει τουλάχιστον ένα στοιχείο.Γράψου στο Exercism για να μάθεις και να κατακτήσεις C++ με 19 έννοιες100 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.