Com os conhecimentos que temos agora, é um pouco trabalhoso atualizar uma variável com a ajuda de uma função. Cada argumento de função é tratado como uma cópia e não altera o valor original. Dependendo do tamanho do teu tipo, isto pode ter consequências graves no desempenho do teu 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
As References podem ser vistas como aliases: as alterações feitas nelas têm efeito na variável original.
As References usam um e comercial (&) na declaração do 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 reatribuir uma reference (alterar a sua ligação).
Não podes ter uma reference não inicializada.
As References têm de ser inicializadas 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, podes não precisar de devolver um valor de uma função.
Neste cenário, void é usado como tipo de retorno.
void increase_power(int& level) {
level += 500;
}
int goku{8700};
increase_power(goku);
// goku's power level?
// It's over 9000!
Uma escola perto de ti tem uma associação de estudantes muito ativa. A associação de estudantes é gerida por um presidente e, a cada 2 anos, realizam-se eleições para eleger um novo presidente.
Na eleição deste ano, decidiu-se que era necessário um novo sistema digital para contar os votos. A escola precisa da tua ajuda para construir este novo sistema.
ElectionResult
O novo sistema vai precisar de uma forma de obter o número de votos a partir de um contador.
A struct do resultado eleitoral já está criada para ti 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, não precisas de escrever um constructor para inicializar um objeto ElectionResult.
Em vez disso, podes usar uma initializer list:
ElectionResult hamilton{"Alex", 1804};
// => the hamilton object was initialized with the name "Alex" and 1804 votes.
Cria uma função vote_count que recebe uma referência a um ElectionResult como argumento e devolve o número de votos do ElectionResult.
vote_count(hamilton);
// => 1804
ElectionResult
Finalmente chegou a hora de processar os votos!
Agora precisas de uma forma de incrementar os votos de um ElectionResult.
Cria uma função void increment_vote_count que recebe uma referência a um ElectionResult como argumento e um número de votos, e incrementa o ElectionResult nesse número de votos.
ElectionResult burr{"Aaron " 1801};
increment_vote_count(burr, 3);
vote_count(burr);
// => 1804
A escola entregou os seus votos e agora é altura de verificar os resultados para descobrir o vencedor.
Cria uma função determine_result que recebe uma referência a uma contagem final e devolve uma referência ao ElectionResult do novo presidente.
Também deve alterar o nome do vencedor, acrescentando-lhe o prefixo "President".
A contagem final é dada na forma de uma reference a std::vector<ElectionResult>, um vector 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, podes assumir o seguinte:
vector tem pelo menos um elemento.Inscreve-te no Exercism para aprenderes e dominares C++ com 19 conceitos100 exercícios, e mentoria humana real, tudo grátis.