Com o que sabemos até agora, é um pouco complicado atualizar uma variável com a ajuda de uma função. Todo argumento de função é tratado como uma cópia e não altera o valor original. Dependendo do tamanho do seu tipo, isso pode ter consequências sérias para o desempenho do seu código.
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
Dá para pensar em References como apelidos: mudanças nelas têm efeito sobre a variável original.
References usam um e comercial (&) na declaração de tipo.
int balance{1000};
int& budget{balance};
int pro_computer_wheels{699};
budget -= pro_computer_wheels;
// budget is now 301;
// balance is also 301;
Não é possível reassentar (mudar a ligação de uma reference).
Você não pode ter uma reference não inicializada.
É preciso inicializar References com uma variável existente.
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!
voidCom o poder das references, você pode nem precisar retornar um valor de uma função.
void é usado como tipo de retorno nesse cenário.
void increase_power(int& level) {
level += 500;
}
int goku{8700};
increase_power(goku);
// goku's power level?
// It's over 9000!
Uma escola local perto de você tem uma associação de estudantes muito ativa. A associação de estudantes é administrada por um presidente e, a cada 2 anos, são realizadas eleições para eleger um novo presidente.
Na eleição deste ano, foi decidido que era necessário um novo sistema digital para contar os votos. A escola precisa da sua ajuda para construir esse novo sistema.
ElectionResult
O novo sistema vai precisar de uma forma de obter o número de votos de um contador.
A struct de resultado da eleição já foi criada para você e está definida assim:
struct ElectionResult {
// Name of the candidate
std::string name{};
// Number of votes the candidate has
int votes{};
};
Como todos os membros da struct são públicos, você não precisa escrever um constructor para inicializar um objeto ElectionResult.
Você pode usar uma initializer list em vez disso:
ElectionResult hamilton{"Alex", 1804};
// => the hamilton object was initialized with the name "Alex" and 1804 votes.
Crie uma função vote_count que receba uma referência a um ElectionResult como argumento e retorne o número de votos no ElectionResult.
vote_count(hamilton);
// => 1804
ElectionResult
Finalmente chegou a hora de processar os votos!
Agora você precisa de uma forma de incrementar os votos em um ElectionResult.
Crie uma função void increment_vote_count que receba uma referência a um ElectionResult como argumento e um número de votos, e incremente o ElectionResult com esse número de votos.
ElectionResult burr{"Aaron " 1801};
increment_vote_count(burr, 3);
vote_count(burr);
// => 1804
A escola entregou os votos e agora chegou a hora de verificar os resultados para saber quem venceu.
Crie uma função determine_result que recebe uma referência a uma contagem final e retorna uma referência ao ElectionResult do novo presidente.
Ela também deve mudar o nome do vencedor, adicionando o prefixo "President" a ele.
A contagem final é dada na forma de uma reference para std::vector<ElectionResult>, um vetor com os ElectionResults de todos os candidatos participantes.
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"
Para simplificar, você pode assumir o seguinte:
vector tem pelo menos um elemento.Crie sua conta no Exercism para aprender e dominar C++ com 19 conceitos100 exercícios e mentoria humana de verdade, tudo de graça.