Referencia constante frente a paso de parámetros normales en C++
- Pasar por valor en C++
- Pasar por referencia en C++
- Pasar usando la referencia constante en C++
- Resumen
Este artículo discutirá las diferencias entre la referencia constante y el paso normal de parámetros.
Para comprender mejor la referencia constante, primero debemos comprender la diferencia entre pasar por valor, pasar por referencia y pasar por referencia constante.
Pasar por valor en C++
Antes de pasar el valor del parámetro, el compilador crea una copia de su memoria utilizando una variable ficticia y se pasa su valor.
#include <bits/stdc++.h>
using namespace std;
void fun(int num) { num = num + 10; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
Producción :
30
Cuando el parámetro n
pasa por la función fun()
, el compilador crea una copia de memoria en n
. Como es una copia, el valor original de n
no será modificado por la función.
Aquí nos encontramos con dos desventajas. No podemos cambiar su valor y se crea una copia del parámetro, un desperdicio de memoria.
Pasar por referencia en C++
Este método elimina las desventajas del método de paso por valor. En lugar de crear un parámetro ficticio y pasar su valor, pasamos el alias de la variable.
Por lo tanto, no hay desperdicio de memoria, y dado que se pasa el alias de la variable, cualquier cambio realizado en la variable en la función se reflejará.
#include <bits/stdc++.h>
using namespace std;
void fun(int &num) { num = num + 10; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
El valor de n
se ve afectado aquí.
40
Pasar usando la referencia constante en C++
Ahora, podemos usar la referencia const cuando no queremos desperdiciar memoria y no cambiamos el valor de la variable.
#include <bits/stdc++.h>
using namespace std;
void fun(const int &num) { num = num + 10; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
El código anterior generará un error de compilación ya que num = num +10
se pasa como una referencia constante. Como es constante, el parámetro se vuelve de solo lectura y no podemos cambiar el valor de num
.
Producción :
[Error] assignment of read-only reference 'num'
Aunque mencionamos que el valor del parámetro no se puede cambiar cuando la referencia es una referencia constante, existen algunas diferencias sutiles pero cruciales.
Si un parámetro es una referencia const
, pero el parámetro pasado era not const
, entonces el valor del parámetro puede cambiarse durante la llamada a la función.
#include <bits/stdc++.h>
using namespace std;
void fun(const int &n) { const_cast<int &>(n) = 40; }
int main() {
int n = 30;
fun(n);
cout << n << endl;
}
Observamos que aunque el parámetro pasado no fue const. La función fun
podría cambiar su valor con la ayuda de cast.
Producción :
40
Cuando se usa una referencia const para pasar un parámetro, incluye el costo adicional por desreferenciar. La peor localidad de referencia y casi cero oportunidades para la optimización del compilador.
Resumen
Sintaxis - Pasar por valor:
double fun(vector<double> my_vector); //pass by value
El objeto o vector subyacente aquí se copia utilizando su constructor de copia. El nuevo objeto tiene memoria adicional asignada, y todos los valores y subobjetos se copian y almacenan por separado.
Entonces, la función anterior copiará el vector y realizará los cambios en la copia de ese vector en lugar del vector original en sí. Si el objeto o el vector que pasa es enorme, el proceso de copia se volverá muy tedioso, desperdiciando nuestro almacenamiento y bucles de CPU.
Sintaxis - Pasar por referencia:
double fun(vector<double> &my_vector); //pass by reference
El vector subyacente no se copia y se pasa la dirección de memoria del propio vector, por lo que los cambios realizados por la función se realizarán directamente en el vector original.
Esto ahorra tanto la memoria como los bucles de la CPU, ya que no se asigna nueva memoria y no se llama a los (costosos) constructores de copias.
Sintaxis - Pasar por constante Referencia:
double fun(const vector<double> &my_vector); //pass by const reference
La sintaxis anterior es similar a pasar por referencia, la única diferencia es que no podemos modificar los valores subyacentes. Esto soluciona el problema de no copiar y no modificar los valores de nuestro objeto.
Aquí, el símbolo de referencia (&
) indica que el vector no debe copiarse, y la palabra clave const hace que nuestro vector no sea modificable y sea de solo lectura.