HOWTO · C++

Chiama per riferimento vs Chiama per valore in C++

In questo articolo viene illustrato come chiamare per riferimento vs chiamata per valore in C++

Questo articolo spiegherà diversi metodi su come chiamare per riferimento e come chiamare per valore in C++.

Usa il simbolo & per chiamare la funzione tramite riferimento in C++

Gli argomenti della funzione sono la parte centrale della definizione della funzione, poiché sono i valori che inizializzano i parametri della funzione. Quando il parametro è un riferimento, è associato all’argomento e il valore dell’argomento non viene copiato. Il comportamento corrispondente è chiamato passando per riferimento o che la funzione è chiamata per riferimento. Si noti che questo metodo è più comunemente usato quando è necessario passare oggetti relativamente più grandi tra le funzioni poiché consente di risparmiare risorse extra trattenute dal processo di copia.

Le operazioni che vengono condotte sull’oggetto all’interno della funzione modificheranno la posizione di memoria originale della variabile, che è un metodo simile al passaggio del puntatore all’oggetto. Nell’esempio seguente, dimostriamo la funzione func che accetta un singolo parametro di tipo int e assegna il valore 123. Il simbolo i è semplicemente il nome alias per l’oggetto j originale dal programma main. Ricorda però che il simbolo & è piuttosto sovraccarico in C++ e non deve essere confuso con la funzionalità dell’operatore di indirizzo.

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

Produzione:

j = 123

Utilizzare la definizione di funzione semplice per chiamare le funzioni in base al valore in C++

La chiamata alla funzione in base al valore viene spesso detta per il comportamento quando la funzione data copia il parametro e lo memorizza come oggetto separato nel rispettivo ambito. La notazione corrispondente non richiede simboli distinti, ma gli argomenti sono specificati come semplici variabili. Di conseguenza, l’ambito del blocco funzione ha un oggetto separato e le modifiche ad esso non influenzano la variabile originale dalla funzione main. La pratica più comune sarebbe quella di impiegare il metodo chiamata per valore quando gli argomenti passati sono tipi incorporati o piccoli oggetti facilmente copiabili tra le funzioni.

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

Produzione:

j = 123
j = 0
j = 123