Référence Const vs passage de paramètre normal en C++

Suraj P 12 octobre 2023
  1. Passer par valeur en C++
  2. Passer par référence en C++
  3. Passer en utilisant la référence Const en C++
  4. Résumé
Référence Const vs passage de paramètre normal en C++

Cet article traite des différences entre le référencement const et le passage normal de paramètres.

Pour mieux comprendre le référencement const, nous devons d’abord comprendre la différence entre passer par valeur, passer par référence et passer par référence const.

Passer par valeur en C++

Avant de transmettre la valeur du paramètre, le compilateur crée une copie de sa mémoire à l’aide d’une variable factice, et sa valeur est transmise.

#include <bits/stdc++.h>
using namespace std;

void fun(int num) { num = num + 10; }

int main() {
  int n = 30;
  fun(n);
  cout << n << endl;
}

Production:

30

Lorsque le paramètre n passe par la fonction fun(), le compilateur crée une copie mémoire dans n. Puisqu’il s’agit d’une copie, la valeur originale de n ne sera pas modifiée par la fonction.

Ici, nous rencontrons deux inconvénients. Nous ne pouvons pas changer sa valeur, et une copie du paramètre est créée, un gaspillage de mémoire.

Passer par référence en C++

Cette méthode élimine les inconvénients de la méthode du passage par valeur. Au lieu de créer un paramètre factice et de transmettre sa valeur, nous transmettons l’alias de la variable.

Donc, pas de gaspillage de mémoire, et puisque l’alias de la variable est passé, toute modification apportée à la variable dans la fonction sera reflétée.

#include <bits/stdc++.h>
using namespace std;

void fun(int &num) { num = num + 10; }

int main() {
  int n = 30;
  fun(n);
  cout << n << endl;
}

La valeur de n est affectée ici.

40

Passer en utilisant la référence Const en C++

Maintenant, nous pouvons utiliser la référence const lorsque nous ne voulons pas perdre de mémoire et ne changeons pas la valeur 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;
}

Le code ci-dessus lancera une erreur de compilation car num = num +10 est passé comme référence const. Comme c’est const, le paramètre devient en lecture seule, et on ne peut pas changer la valeur de num.

Production:

[Error] assignment of read-only reference 'num'

Bien que nous ayons mentionné que la valeur du paramètre ne pouvait pas être modifiée lorsque la référence est une référence const, il existe des différences subtiles mais cruciales.

Si un paramètre est une référence const, mais que le paramètre passé était not const, alors la valeur du paramètre peut être modifiée lors de l’appel de la fonction.

#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;
}

Nous observons que même si le paramètre passé n’était pas const. La fonction fun pouvait changer sa valeur à l’aide de cast.

Production:

40

Lorsqu’une référence const est utilisée pour transmettre un paramètre, elle inclut le coût supplémentaire du déréférencement. La pire localité de référence et presque aucune opportunité d’optimisation du compilateur.

Résumé

Syntaxe - Passer par valeur :

double fun(vector<double> my_vector);  //pass by value

L’objet ou le vecteur sous-jacent ici est copié à l’aide de son constructeur de copie. Le nouvel objet dispose d’une mémoire supplémentaire qui lui est allouée, et toutes les valeurs et sous-objets sont copiés et stockés séparément.

Ainsi, la fonction ci-dessus copiera le vecteur et apportera les modifications à la copie de ce vecteur plutôt qu’au vecteur d’origine lui-même. Si l’objet ou le vecteur passant est énorme, le processus de copie deviendra très fastidieux, gaspillant nos cycles de stockage et de CPU.

Syntaxe - Passer par référence :

double fun(vector<double> &my_vector);  //pass by reference

Le vecteur sous-jacent n’est pas copié et l’adresse mémoire du vecteur lui-même est transmise, de sorte que les modifications apportées par la fonction seront effectuées directement sur le vecteur d’origine.

Cela économise à la fois la mémoire et les cycles CPU car aucune nouvelle mémoire n’est allouée et aucun constructeur de copie (coûteux) n’est appelé.

Syntaxe - Passer par Const Référence :

double fun(const vector<double> &my_vector);  //pass by const reference

La syntaxe ci-dessus est similaire au passage par référence, la seule différence est que nous ne pouvons pas modifier les valeurs sous-jacentes. Cela résout le problème de ne pas copier et de ne pas modifier les valeurs de notre objet.

Ici, le symbole de référence (&) indique que le vecteur ne doit pas être copié, et le mot-clé const rend notre vecteur non modifiable c’est-à-dire en lecture seule.

Auteur: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

Article connexe - C++ Reference