Appel par référence vs appel par valeur en C++

Jinku Hu 12 octobre 2023
  1. Utilisez le symbole & pour appeler la fonction par référence en C++
  2. Utiliser la définition de fonction simple pour appeler des fonctions par valeur en C++
Appel par référence vs appel par valeur en C++

Cet article explique plusieurs méthodes pour appeler par référence ou appeler par valeur en C++.

Utilisez le symbole & pour appeler la fonction par référence en C++

Les arguments de fonction sont la partie centrale de la définition de fonction, car ce sont les valeurs qui initialisent les paramètres de la fonction. Lorsque le paramètre est une référence, il est lié à l’argument et la valeur de l’argument n’est pas copiée. Le comportement correspondant est appelé en passant par la référence ou que la fonction est appelée par référence. Notez que cette méthode est plus couramment utilisée lorsque des objets relativement plus volumineux doivent être passés entre les fonctions car elle économise des ressources supplémentaires retenues par le processus de copie.

Les opérations effectuées sur l’objet à l’intérieur de la fonction modifieront l’emplacement de mémoire d’origine de la variable, ce qui est une méthode similaire au passage du pointeur vers l’objet. Dans l’exemple suivant, nous montrons la fonction func qui prend un seul paramètre de type int et assigne la valeur 123. Le symbole i est simplement le nom d’alias de l’objet j original du programme main. Attention cependant, le symbole & est assez surchargé en C++ et ne doit pas être confondu avec la fonctionnalité d’opérateur d’adresse.

#include <iostream>

using std::cout;
using std::endl;

void func(int &i) { i = 123; }

int main() {
  int j = 0;
  func(j);
  cout << "j = " << j << endl;

  exit(EXIT_SUCCESS);
}

Production:

j = 123

Utiliser la définition de fonction simple pour appeler des fonctions par valeur en C++

L’appel de la fonction par valeur est souvent dit pour le comportement lorsque la fonction donnée copie le paramètre et le stocke en tant qu’objet séparé dans la portée respective. La notation correspondante ne nécessite aucun symbole distinct, mais les arguments sont spécifiés en tant que variables simples. Par conséquent, la portée du bloc fonction a un objet séparé, et les modifications apportées à celui-ci n’affectent pas la variable d’origine de la fonction main. La pratique la plus courante serait d’employer la méthode appel par valeur lorsque les arguments passés sont des types intégrés ou de petits objets facilement copiés entre les fonctions.

#include <iostream>

using std::cout;
using std::endl;

void func2(int i) { i = 123; }

void func(int &i) { i = 123; }

void func(int *ip) {
  *ip = 123;
  ip = nullptr;
}

int main() {
  int j = 0;
  func(j);
  cout << "j = " << j << endl;

  j = 0;
  func2(j);
  cout << "j = " << j << endl;

  j = 0;
  func(&j);
  cout << "j = " << j << endl;

  exit(EXIT_SUCCESS);
}

Production:

j = 123
j = 0
j = 123
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Function