Konstante Referenz vs. normale Parameterübergabe in C++

Suraj P 12 Oktober 2023
  1. Wertübergabe in C++
  2. Pass by Reference in C++
  3. Pass Using Const Reference in C++
  4. Zusammenfassung
Konstante Referenz vs. normale Parameterübergabe in C++

In diesem Artikel werden die Unterschiede zwischen der Konstantenreferenzierung und der normalen Parameterübergabe erläutert.

Um die const-Referenzierung besser zu verstehen, müssen wir zunächst den Unterschied zwischen Pass-by-Value, Pass-by-Reference und Pass-by-Const-Reference verstehen.

Wertübergabe in C++

Bevor der Parameterwert übergeben wird, erstellt der Compiler mithilfe einer Dummy-Variablen eine Kopie seines Speichers, und sein Wert wird übergeben.

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

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

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

Ausgabe:

30

Wenn der Parameter n die Funktion fun() durchläuft, erstellt der Compiler eine Speicherkopie in n. Da es sich um eine Kopie handelt, wird der ursprüngliche Wert von n durch die Funktion nicht verändert.

Hier stoßen wir auf zwei Nachteile. Wir können seinen Wert nicht ändern, und es wird eine Kopie des Parameters erstellt, eine Verschwendung von Speicher.

Pass by Reference in C++

Dieses Verfahren eliminiert die Nachteile der Pass-by-Value-Methode. Anstatt einen Dummy-Parameter zu erstellen und seinen Wert zu übergeben, übergeben wir den Alias ​​der Variablen.

Also keine Speicherverschwendung, und da der Alias ​​der Variablen übergeben wird, wird jede Änderung an der Variablen in der Funktion widergespiegelt.

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

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

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

Hier wird der Wert von n beeinflusst.

40

Pass Using Const Reference in C++

Jetzt können wir die const-Referenz verwenden, wenn wir keine Speicherverschwendung wollen und den Wert der Variablen nicht ändern.

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

Der obige Code löst einen Kompilierungsfehler aus, da num = num +10 als const-Referenz übergeben wird. Da es const ist, wird der Parameter schreibgeschützt und wir können den Wert von num nicht ändern.

Ausgabe:

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

Obwohl wir erwähnt haben, dass der Wert des Parameters nicht geändert werden kann, wenn die Referenz eine const-Referenz ist, gibt es einige subtile, aber entscheidende Unterschiede.

Wenn ein Parameter eine const-Referenz ist, aber der übergebene Parameter not const war, dann kann der Wert des Parameters während des Funktionsaufrufs geändert werden.

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

Wir beobachten, dass der übergebene Parameter nicht const war. Die Funktion fun könnte ihren Wert mit Hilfe von cast ändern.

Ausgabe:

40

Wenn eine konstante Referenz verwendet wird, um einen Parameter zu übergeben, sind die zusätzlichen Kosten für die Dereferenzierung enthalten. Die schlechteste Referenzlokalität und fast keine Möglichkeiten zur Compileroptimierung.

Zusammenfassung

Syntax - Wertübergabe:

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

Das zugrunde liegende Objekt oder der Vektor wird hier mit seinem Kopierkonstruktor kopiert. Dem neuen Objekt wird zusätzlicher Speicher zugewiesen, und alle Werte und Unterobjekte werden kopiert und separat gespeichert.

Die obige Funktion kopiert also den Vektor und nimmt die Änderungen an der Kopie dieses Vektors statt am ursprünglichen Vektor selbst vor. Wenn das übergebene Objekt oder der Vektor sehr groß ist, wird der Kopiervorgang sehr mühsam und verschwendet unsere Speicher- und CPU-Zyklen.

Syntax - Als Referenz übergeben:

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

Der zugrunde liegende Vektor wird nicht kopiert, und die Speicheradresse des Vektors selbst wird weitergegeben, sodass Änderungen, die von der Funktion vorgenommen werden, direkt am ursprünglichen Vektor vorgenommen werden.

Das spart sowohl Speicher als auch CPU-Zyklen, da kein neuer Speicher allokiert und keine (teuren) Kopierkonstruktoren aufgerufen werden.

Syntax - Pass by Const Referenz:

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

Die obige Syntax ähnelt der Referenzübergabe, der einzige Unterschied besteht darin, dass wir die zugrunde liegenden Werte nicht ändern können. Dies löst das Problem, die Werte unseres Objekts nicht zu kopieren und nicht zu ändern.

Hier gibt das Referenzsymbol (&) an, dass der Vektor nicht kopiert werden soll, und das Schlüsselwort const macht unseren Vektor nicht modifizierbar, also schreibgeschützt.

Autor: 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

Verwandter Artikel - C++ Reference