C ++ Grundkonzept bezüglich des Rückgabetyps des Referenzoperators

8

Ich muss ein Grundkonzept klären. Dieser Code funktioniert gut. Kann mir jemand erklären, dass wenn die Funktion calDouble bereits die Adresse (Referenz) von int zurückgibt, warum muss ich & amp; Operator weiter im Haupt int * j = & amp; calDouble (i); um die Adresse (Referenz) von int zu erhalten? Danke.

%Vor%     
developer 07.07.2012, 06:29
quelle

2 Antworten

3

int& calDouble(int x) liefert keine Adresse, sondern einen Verweis auf int .

Sie müssen die Adresse der Referenz nehmen, um sie einem Zeiger zuweisen zu können.

Beachten Sie jedoch, dass Ihr Code undefiniertes Verhalten aufruft. Da Sie den Parameter als Wert übergeben, wird eine Kopie davon in der Funktion erstellt. Sie geben also eine lokale Variable als Referenz zurück, was nicht legal ist.

Ich denke, deine Verwirrung kommt von & . Dies kann auf zwei Arten verwendet werden:

  • angewendet auf eine Variable &x , nimmt sie ihre Adresse
  • Wenn es in einer Deklaration int& x definiert ist, definiert es eine Referenz

Eine Referenz ist nur ein Alias, ein anderer Name für eine Variable.

%Vor%

Nun beziehen sich x und y auf dieselbe Variable.

%Vor%

übernimmt die Adresse von x .

    
Luchian Grigore 07.07.2012, 06:31
quelle
1

int& ist ein Referenztyp. Es ist nicht die Adresse.

Um zu sehen, was &calDouble(i) macht, überlegen Sie, ob wir es in zwei Anweisungen aufgeteilt haben:

%Vor%

Die Funktion calDouble() gibt einen Referenztyp zurück, und das vorangestellte & übernimmt dann die Adresse von , die zurückgegeben wurde. Also ist der Typ jetzt int* , weshalb diese Zeile kompiliert wird.

Ihr Programm weist jedoch undefiniertes Verhalten auf! Der x in calDouble() verschwindet, sobald die Funktion endet. Der Wert, der ursprünglich dort war , kann immer noch im Speicher sein , weshalb Ihr Programm "funktioniert". Aber das ist im Produktionscode nicht zuverlässig und eines Tages wird Ihr perfekt funktionierendes Testprogramm in dem Moment explodieren, in dem es eingesetzt wird.

Es ist generell eine schlechte Idee, einen Verweis auf eine lokale Variable für diesen unterschiedlichen Grund zurückzugeben. (Sie werden feststellen, dass Klassenmethoden Verweise auf Elementdaten zurückgeben, was in Ordnung ist, solange sich das Objekt noch im Bereich befindet, da diese Variablen noch vorhanden sind.) Geben Sie einfach ein normales int zurück und machen Sie mit dem Leben weiter. Ein optimierender Compiler kann eine Rückgabewertoptimierung durchführen, wenn Sie sich bei der Rückgabe großer Objekte Sorgen um die Leistung machen.

    
chrisaycock 07.07.2012 06:37
quelle