Zum Forum springen
Benachrichtigungen
Alles löschen

[Geschlossen] &-Operator in C++

5 Beiträge
4 Benutzer
0 Reactions
342 Ansichten
frib
Beigetreten: 26.08.2006
Elite Grinder

Hi,

ich hab zwar schon gegoogelt, aber findet mal was spezifisches wenn ihr nach "& C++" sucht :)
Mein Problem ist folgendes: Ich verstehe den Einsatz von & an manchen Stellen nicht.
Grundsätzlich: Mir ist klar, dass & als Referenz verwendet werden kann:
int b = 2;
int& a = b;

Oder als Adressoperator:
int b = 2;
int *a = &b;

Und damit auch für nen Call-by-reference Funktionsaufruf:
void add5(int& a) { a+5; }

Was ich aber nicht verstehe sind Funktionsaufrufe mit & *:
addVector(double& *a, double &*b) {...}
Was ist das? Ne Referenz auf nen Zeiger? Verstehe ich nicht :(

Und der 2. Punkt, den ich nicht verstehe: & als Rückgabewert einer Funktion:
double& myfunction(double a) {...}
Wird da ne Referenz zurückgegeben? Wie ist das zu verstehen?


4 Antworten
crt32
Beigetreten: 17.02.2007
Elite Grinder
addVector(double& *a, double &*b) {...}

Das wäre ein Pointer auf eine Referenz. Sehe da keinen Sinn drin.

Was dir öfters begegnet ist double*&, das ist eine Referenz auf einen Pointer.
zB kannst du damit sowas machen:

void f(double*& p) { p = NULL; }

double * p;
f(p);

-> p ist jetzt NULL

double& myfunction(double a) {...}

Ja, hier wird eine Referenz zurückgegeben. Macht aber außer als Methode einer Klasse selten Sinn.

Ganz schlecht wäre zB

double& myfunction(double a) {
  double b;
  return b;
}

Da wird dann eine Referenz auf eine temporäre Variable zurückgegeben, dh zB so Code wäre denkbar:

myfunction(10) = 11;

oder noch schlimmer:

double& x = myfunction(10);

Geht dann halt irgendwann schief, weil die temporären Variablen in sozusagen freigegebenem Speicher liegen, also spätestens beim nächsten Funktionsaufruf überschrieben werden.

Noch ein positives Beispiel, wo das ganze Sinn macht:

double& max(double& a, double& b) {
  return (a > b) ? a : b;
}

Damit wäre folgener (sinnvoller) Code denkbar:

double a,b;
max(a,b) = 10;

Es wird dann der größeren Variable 10 zugewiesen.

Oder halt in einer Klasse:

class C {
double x;
public:
  double& GetXRef() { return x; }
};
...
C c;
c.GetXRef() = 10;

MisterJ
Beigetreten: 26.03.2006
PokerStrategist

Vorsicht:

void add5(int& a) { a+5; }

sollte wohl

void add5(int& a) { a+=5; }

sein.


frib Themenstarter
frib
Beigetreten: 26.08.2006
Elite Grinder

Danke schonmal crt für den Post, da wird mir direkt einiges klarer. :) Vielleicht melde ich mich morgen nochmal mit nem speziellen Codebeispiel, hab gerade nix da, aber vielleicht versteh ichs jetzt auch schon so :P
Besonders für das erste Beispiel, kommt bei Expression-Templates vor, weshalb ich auch den Post erstellt hab. Muss das Zeug gerade lernen und komme wirklich nur stückchenweise voran

@ MIsterJ: Stimmt natürlich. Hab jetzt einfach schnell was runtergetipp ;)


noelte
Beigetreten: 13.05.2007
Elite Grinder

Original von crt32

double& myfunction(double a) {...}

Ja, hier wird eine Referenz zurückgegeben. Macht aber außer als Methode einer Klasse selten Sinn.

Ganz schlecht wäre zB

double& myfunction(double a) {
  double b;
  return b;
}

wenn de

double& myfunction(double a) {
  static double b;
  return b;
}

schreibst macht es oft schon Sinn, da im Gegensatz zu global definierten Variablen, hier der Zeitpunkt der Erstellung von deterministisch ist.... bei double nicht so wichtig, eher bei objekt-instanzen


Teilen: