Lección 13 · 13 de 20
Referencias y referencias const · C++
Entienda en C++ la diferencia entre pasar por valor y por referencia (&), y use const & para pasar vectores y cadenas sin copiarlos.

Por defecto, C++ pasa los argumentos por valor: la función recibe una copia. addBonusCopy suma 50 a su copia, que llega a 150, pero score sigue valiendo 100.
Con `&` detrás del tipo, el parámetro es una referencia: otro nombre para la variable original. addBonus(int& points) trabaja sobre el propio score, que pasa a 150.
Una referencia también puede ser una variable: int& alias = score; no crea nada nuevo, así que alias = 0 pone score a 0. Una referencia queda unida a la misma variable desde que se crea.
Copiar un número no cuesta nada, pero copiar un vector o una cadena larga, sí. `const std::vector<double>&` evita la copia y además promete no modificar el original: si total intentara cambiar prices, el programa no compilaría. Es la forma habitual de pasar cadenas y vectores.
En un for de rango, double& p permite cambiar cada elemento, y el 10 % de descuento queda aplicado en basket. Para solo leer, const double& p.
Código · main.cpp
#include <iostream>#include <vector>// By value: the function gets a copy, so the original does not change.void addBonusCopy(int points) { points += 50; std::cout << "Inside the copy: " << points << '\n'; }// By reference (&): the function works on the original variable.void addBonus(int& points) { points += 50; }// const reference: no copy and no changes. Ideal for strings and vectors.double total(const std::vector<double>& prices) { double sum = 0; for (double p : prices) sum += p; return sum;}int main() { int score = 100; addBonusCopy(score); std::cout << "After the copy: " << score << '\n'; addBonus(score); std::cout << "After the reference: " << score << '\n'; int& alias = score; // a reference: another name for the same variable alias = 0; std::cout << "alias = 0, so score is now " << score << '\n'; // In a for, & changes each element in place: a 10% discount. std::vector<double> basket = {20.0, 12.5, 7.5}; for (double& p : basket) p *= 0.9; for (const double& p : basket) std::cout << p << ' '; std::cout << "\nTotal after discount: " << total(basket) << '\n'; return 0;}Salida · c++ -std=c++17 main.cpp -o main && ./main
Inside the copy: 150 After the copy: 100 After the reference: 150 alias = 0, so score is now 0 18 11.25 6.75 Total after discount: 36
Para recordar
- Por valor, la función trabaja con una copia.
- Con
tipo&, trabaja con el original. const tipo&evita la copia y prohíbe los cambios.for (auto& x : v)modifica los elementos del vector.- Pase cadenas y vectores como
const &si solo los lee.
Ejercicio
Escriba void applyVat(std::vector<double>& prices), que sume el 21 % a cada precio, y double maxPrice(const std::vector<double>& prices), y pruébelas con la cesta.