DMarlon Studio

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.

C++ · Referencias y referencias const en DMarlon Studio: el código del ejemplo y su salida en la terminal

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.