Con quello che sappiamo finora, aggiornare una variabile con l'aiuto di una funzione è un po' macchinoso. Ogni argomento di una funzione viene trattato come una copia e non modifica il valore originale. A seconda della dimensione del tipo, questo può avere conseguenze pesanti sulle prestazioni del codice.
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 si possono vedere come alias: le modifiche che vi si apportano hanno effetto sulla variabile originale.
References usano una e commerciale (&) nella dichiarazione del tipo.
int balance{1000};
int& budget{balance};
int pro_computer_wheels{699};
budget -= pro_computer_wheels;
// budget is now 301;
// balance is also 301;
Riposizionare un reference (cambiare a cosa è legato) non è possibile.
Non si può avere un reference non inizializzato.
I References vanno inizializzati con una variabile esistente.
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!
voidGrazie alla potenza dei references, potresti non aver bisogno di restituire alcun valore da una funzione.
In questo scenario, void si usa come tipo di ritorno.
void increase_power(int& level) {
level += 500;
}
int goku{8700};
increase_power(goku);
// goku's power level?
// It's over 9000!
Una scuola locale vicino a te ha un'associazione studentesca molto attiva. L'associazione studentesca è gestita da un presidente e ogni 2 anni si tengono le elezioni per eleggere un nuovo presidente.
Per le elezioni di quest'anno è stato deciso che serviva un nuovo sistema digitale per contare i voti. La scuola ha bisogno del tuo aiuto per costruire questo nuovo sistema.
ElectionResult
Il nuovo sistema avrà bisogno di un modo per ottenere il numero di voti da un contatore.
La struct del risultato elettorale è già stata creata per te ed è definita così:
struct ElectionResult {
// Name of the candidate
std::string name{};
// Number of votes the candidate has
int votes{};
};
Dato che tutti i membri della struct sono pubblici, non devi scrivere un constructor per inizializzare un oggetto ElectionResult.
Puoi invece usare un initializer list:
ElectionResult hamilton{"Alex", 1804};
// => the hamilton object was initialized with the name "Alex" and 1804 votes.
Crea una funzione vote_count che prende come argomento un riferimento a un ElectionResult e restituisce il numero di voti contenuti nell'ElectionResult.
vote_count(hamilton);
// => 1804
ElectionResult
È finalmente il momento di elaborare i voti!
Ora ti serve un modo per incrementare i voti in un ElectionResult.
Crea una funzione void increment_vote_count che prende come argomenti un riferimento a un ElectionResult e un numero di voti, e incrementa l'ElectionResult di quel numero di voti.
ElectionResult burr{"Aaron " 1801};
increment_vote_count(burr, 3);
vote_count(burr);
// => 1804
La scuola ha consegnato i voti ed è ora di controllare i risultati per scoprire il vincitore.
Crea una funzione determine_result che riceve un riferimento a un conteggio finale e restituisce un riferimento all'ElectionResult del nuovo presidente.
Dovrebbe anche cambiare il nome del vincitore anteponendogli «President».
Il conteggio finale è fornito sotto forma di un reference a std::vector<ElectionResult>, un vettore con gli ElectionResults di tutti i candidati partecipanti.
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"
Per semplificare, puoi dare per scontate le seguenti cose:
vector ha almeno un elemento.Iscriviti a Exercism per imparare e padroneggiare C++ con 19 concetti100 esercizi e il mentoring di persone reali, tutto gratis.