Frank Schönmann: Wie komisch ist das denn?

Beitrag lesen

hi!

Ich habe immer noch nicht ganz verstanden, wann man jetzt Variablen
var durch "&var" und wann als "*var" deklarieren muss!? Mit google
ist ohne Kenntnis der genaueren Suchsyntax ja nichts zu machen bei
solchen Zeichen, finde leider nix.
&var brauchst du bei der Deklaration (Anlegen von Variablen) nie, erst
bei der Initialisierung (Wertzuweisung).

Das stimmt so aber auch nicht. Wenn man bei der Deklaration & verwendet,
erhaelt man eine Referenz. Referenzen sind sowas aehnliches wie Pointer; man
kann damit einer Variable einen zweiten Namen geben, allerdings laesst sich
die Referenz danach nicht mehr umbiegen und die Pointer-Zugriffssyntax
faellt weg.

  
int a = 1;  
int& b = a;  

b ist jetzt eine Referenz auf a. Das heisst, auf den Wert, der dahinter
steckt, kannst du durch beide Variablen zugreifen:

  
++a;  
++b;  

Sowohl a als auch b haben jetzt den Wert 3.

Referenzen braucht man bei normalen Variablendeklarationen relativ selten.
Wo sie aber sehr haeufig vorkommen, ist bei der Deklaration von Parametern
fuer Funktionen. Das ist in jedem ordentlichen C++-Buch unter dem
Unterschied von "call by reference" und "call by value" beschrieben.
Verwendet man "call by value", wird ein Funktionsargument kopiert, bevor
es an die Funktion uebergeben wird, bei "call by reference" erhaelt man
eine Referenz auf das Original-Objekt. Letzteres ist in manchen Faellen
deutlich performanter, gerade wenn man C++-Objekte als Parameter uebergibt.

  
#include <iostream>  
#include <vector>  
  
using namespace std;  
  
template <class T>  
void a(vector<T> vec) {  
  cout << "a: " << vec.size() << " elements" << endl;  
  vec.clear();  
}  
  
template <class T>  
void b(vector<T>& vec) {  
  cout << "b: " << vec.size() << " elements" << endl;  
  vec.clear();  
}  
  
int main() {  
  vector<int> vec;  
  vec.push_back(1);  
  vec.push_back(2);  
  vec.push_back(3);  
  
  cout << "1: " << vec.size() << " elements" << endl;  
  a(vec);  
  cout << "2: " << vec.size() << " elements" << endl;  
  b(vec);  
  cout << "3: " << vec.size() << " elements" << endl;  
}  

Beim Aufruf von a() wird der Vektor kopiert, bevor er im Funktionsrumpf
verwendet wird; vec ist dort also lediglich eine lokale Variable. Bei b()
wird der Vektor als Referenz uebergeben, d.h. wenn du den Vektor innerhalb
von b() veraenderst, wirkt sich das auf das Objekt aus, das du ausserhalb
der Funktion (in main()) angelegt hast.

bye, Frank!

--
Never argue with an idiot. He will lower you to his level and then
beat you with experience.