Con nuestros conocimientos actuales, resulta un poco engorroso actualizar una variable con la ayuda de una función. Cada argumento de una función se trata como una copia y no modifica el valor original. Dependiendo del tamaño de tu tipo, esto puede tener graves consecuencias para el rendimiento de tu 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
Las References pueden verse como alias: los cambios en ellas afectan a la variable original.
Las References usan un ampersand (&) en la declaración 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;
No es posible volver a enlazar (cambiar el vínculo de una reference).
No puedes tener una reference sin inicializar.
Las References deben inicializarse con una variable 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!
voidCon el poder de las references, puede que no necesites devolver ningún valor de una función.
void se usa como tipo de retorno en este escenario.
void increase_power(int& level) {
level += 500;
}
int goku{8700};
increase_power(goku);
// goku's power level?
// It's over 9000!
Una escuela cercana tiene una asociación de estudiantes muy activa. La asociación de estudiantes está gestionada por un presidente y, cada 2 años, se celebran elecciones para elegir a un nuevo presidente.
En las elecciones de este año se ha decidido que hacía falta un nuevo sistema digital para contar los votos. La escuela necesita tu ayuda para construir este nuevo sistema.
ElectionResult
El nuevo sistema necesitará una forma de obtener el número de votos de un contador.
La estructura de resultado electoral ya está creada para ti y se define así:
struct ElectionResult {
// Name of the candidate
std::string name{};
// Number of votes the candidate has
int votes{};
};
Como todos los miembros del struct son públicos, no necesitas escribir un constructor para inicializar un objeto ElectionResult.
En su lugar, puedes usar una initializer list:
ElectionResult hamilton{"Alex", 1804};
// => the hamilton object was initialized with the name "Alex" and 1804 votes.
Crea una función vote_count que reciba una referencia a un ElectionResult como argumento y devuelva el número de votos del ElectionResult.
vote_count(hamilton);
// => 1804
ElectionResult
¡Por fin ha llegado el momento de procesar los votos!
Ahora necesitas una forma de incrementar los votos de un ElectionResult.
Crea una función void increment_vote_count que reciba una referencia a un ElectionResult como argumento y un número de votos, e incremente el ElectionResult en ese número de votos.
ElectionResult burr{"Aaron " 1801};
increment_vote_count(burr, 3);
vote_count(burr);
// => 1804
La escuela ha entregado sus votos y ahora toca comprobar los resultados para ver quién es el ganador.
Crea una función determine_result que reciba una referencia a un recuento final y devuelva una referencia al ElectionResult del nuevo presidente.
También debe cambiar el nombre del ganador añadiéndole el prefijo «President».
El recuento final se da en forma de reference a std::vector<ElectionResult>, un vector con los ElectionResults de todos los 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, puedes dar por sentado lo siguiente:
vector tiene al menos un elemento.Regístrate en Exercism para aprender y dominar C++ con 19 conceptos100 ejercicios y mentoría humana real, todo gratis.