Unterschied zwischen Variablenreferenz und Name

8

Ich studiere Referenz von C ++, und jetzt bin ich ziemlich verwirrt durch den Unterschied zwischen Variablenname und Referenz. Der Testcode ist unten:

%Vor%

So, jetzt habe ich zwei Möglichkeiten, Objekte zu erstellen, die exklusiv sind.

Nach meinem Verständnis erstellt der Compiler, wenn ich options2 verwende, ein temporäres Objekt im Stack-Speicher und gibt den Referenzwert an t2 zurück.

Wenn das richtig ist, wie kann ich die Option1 verbalisieren oder erklären? Es scheint, dass das gleiche Objekt im Stapelspeicher erstellt wird und der Computer dem Objekt den Namen 't2' gibt, aber ich verstehe nicht genau, wie sich diese option1 von der option2 weil ein Name von Variablen und Referenz etwas verwirrend ist.

Zusätzlich, Schaltoptionen alternativ, konnte ich sehen, dass die Objekte jeweils an unterschiedlichen Speicherorten erstellt werden. (Beispielsweise wurde das Objekt von Option1 in 0x7fff5fbff828 erstellt, und das oder Option2 war in 0x7fff5fbff820)

Könnten Sie bitte erklären

?

1. Was ist der Unterschied zwischen einem Variablennamen (Option1) und einer Referenz (Option2)?

2. wie die Dinge in Option 1 und 2 anders funktionieren.

3. warum in beiden Fällen Objekte an unterschiedlichen Speicherorten erstellt werden.

Im Voraus, vielen Dank für Ihre Hilfe!

    
noclew 03.11.2012, 23:18
quelle

2 Antworten

1
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123variables ___ DAS IST AMBIGUOUS; VERWENDEN SIE SPRACHSCHRIFTEN, WENN SIE ANWENDBAR SIND. Eine Variable ist ein benannter Datenspeicherort im Speicher. Ein Computerprogramm kann unter Verwendung von Variablen Zahlen, Text, Binärdaten oder eine Kombination dieser Datentypen speichern. Sie können im Programm weitergegeben werden. ___ tag123pointer ___ Datentyp, der auf einen anderen im Speicher gespeicherten Wert zeigt. Eine Zeigervariable enthält eine Speicheradresse einer anderen Entität (Variable oder Funktion oder andere Entität). Dieses Tag sollte für Fragen verwendet werden, bei denen Zeiger und keine Referenzen verwendet werden. Die gebräuchlichsten Programmiersprachen, die Zeiger verwenden, sind C-, C ++ -, Go- und Assemblersprachen. Verwenden Sie ein bestimmtes Sprach-Tag. Andere hilfreiche Tags sind Methode, Funktion, Struktur usw., die die Verwendung von Pointer beschreiben. ___ tag123reference ___ Eine Referenz ist ein Wert, der es einem Programm ermöglicht, indirekt auf ein bestimmtes Datum wie eine Variable oder einen Datensatz im Computerspeicher oder in einem anderen Speichergerät zuzugreifen. ___ answer13214557 ___
%Vor%

Option1:

ruft den Kopierkonstruktor von TestClass auf und übergibt das temporäre, das auf der rechten Seite des "=" erstellt wird. Kopieren Elision eliminiert unnötiges Kopieren von Objekten (siehe unten).

Option 2:

Sie erstellen ein Objekt, das temporäre, das an die Referenz gebunden wird.

  
  1. Was ist der Unterschied zwischen einem Variablennamen (Option1) und einer Referenz (Option2)?
  2.   

bearbeiten: Ich wusste das vorher nicht, aber in Wirklichkeit gibt es keine zweite Zuweisung in Option 1 (Danke Piotr), dies liegt an der Kopie, die sich auf eine Compiler-Optimierungstechnik bezieht, die unnötiges Kopieren von Objekten verhindert.

Um Ihre Wörter zu verwenden, ist der "Variablenname" ein Speicherblock, der Daten enthält. Der Verweis ist wie ein Zeiger in dem Sinne, dass er auf einen anderen "Variablennamen" zeigt, aber er muss initialisiert werden und ist niemals Null.

  
  1. wie die Dinge in Option 1 und 2 anders funktionieren.
  2.   

Wie bereits erwähnt, ist Option 1 ein statischer Typ, wobei Option 2 auf eine Instanz eines abgeleiteten Objekts (von TestClass) verweisen kann.

  
  1. warum in beiden Fällen Objekte an unterschiedlichen Speicherorten erstellt werden.
  2.   

Obwohl sie "identische" TestObjects (100) sind, sind sie einzelne Instanzen und daher in verschiedenen Speichern (Adressen)

    
___ qstntxt ___

Ich studiere Referenz von C ++, und jetzt bin ich ziemlich verwirrt durch den Unterschied zwischen Variablenname und Referenz. Der Testcode ist unten:

%Vor%

So, jetzt habe ich zwei Möglichkeiten, Objekte zu erstellen, die exklusiv sind.

Nach meinem Verständnis erstellt der Compiler, wenn ich options2 verwende, ein temporäres Objekt im Stack-Speicher und gibt den Referenzwert an t2 zurück.

Wenn das richtig ist, wie kann ich die Option1 verbalisieren oder erklären? Es scheint, dass das gleiche Objekt im Stapelspeicher erstellt wird und der Computer dem Objekt den Namen 't2' gibt, aber ich verstehe nicht genau, wie sich diese option1 von der option2 weil ein Name von Variablen und Referenz etwas verwirrend ist.

Zusätzlich, Schaltoptionen alternativ, konnte ich sehen, dass die Objekte jeweils an unterschiedlichen Speicherorten erstellt werden. (Beispielsweise wurde das Objekt von Option1 in 0x7fff5fbff828 erstellt, und das oder Option2 war in 0x7fff5fbff820)

Könnten Sie bitte erklären

?

1. Was ist der Unterschied zwischen einem Variablennamen (Option1) und einer Referenz (Option2)?

2. wie die Dinge in Option 1 und 2 anders funktionieren.

3. warum in beiden Fällen Objekte an unterschiedlichen Speicherorten erstellt werden.

Im Voraus, vielen Dank für Ihre Hilfe!

    
___ antwort13214544 ___
  

1) Was ist der Unterschied zwischen einem Variablennamen (Option1) und   Referenz (Option2).

Name hat einen statischen Typ. Referenz kann an abgeleitete Klassen gebunden sein - wir kennen den genauen Typ der referenzierten Objekte nicht.

In Ihrem Beispiel - für Option 2 - haben Sie die Lebensdauer des temporären Objekts verlängert, indem Sie eine konstante Referenz darauf erstellt haben - siehe Ссылка

  

Normalerweise dauert ein temporäres Objekt nur bis zum Ende des vollen Objekts   Ausdruck, in dem es erscheint. C ++ spezifiziert jedoch absichtlich   das Binden eines temporären Objekts an einen Verweis auf const auf dem Stapel   verlängert die Lebenszeit des Temporären auf die Lebenszeit des   referenzieren sich selbst und vermeiden so, was sonst üblich wäre   Dangling-Referenzfehler.

  

2) wie die Dinge in Option 1 und 2 anders funktionieren.

Wenn Sie die virtuelle Funktion aufrufen - dann wissen Sie für den Variablennamen, welche Funktion aufgerufen wird, für Referenzen - können Sie in einem komplizierteren Beispiel als Ihrem nicht wissen.

  

3) Warum Objekte in verschiedenen Speicherorten erstellt werden   Fälle.

Sie sind verschiedene Objekte, sie leben in der gleichen Zeit - also warum sollte ihr Speicherort identisch sein?

Ein weiterer Unterschied besteht darin, dass Sie für Option 1 eine automatische Variable, für Option 2 eine temporäre Variable erstellt haben - beide können unterschiedliche Speicher verwenden (Stack vs. Register oder reservierter Speicher nur für Provisorien)

Betrachten Sie ein komplizierteres Beispiel:

%Vor%     
___ qstnhdr ___ Unterschied zwischen Variablenreferenz und Name ___
PiotrNycz 03.11.2012, 23:28
quelle
3
%Vor%

Option1:

ruft den Kopierkonstruktor von TestClass auf und übergibt das temporäre, das auf der rechten Seite des "=" erstellt wird. Kopieren Elision eliminiert unnötiges Kopieren von Objekten (siehe unten).

Option 2:

Sie erstellen ein Objekt, das temporäre, das an die Referenz gebunden wird.

  
  1. Was ist der Unterschied zwischen einem Variablennamen (Option1) und einer Referenz (Option2)?
  2.   

bearbeiten: Ich wusste das vorher nicht, aber in Wirklichkeit gibt es keine zweite Zuweisung in Option 1 (Danke Piotr), dies liegt an der Kopie, die sich auf eine Compiler-Optimierungstechnik bezieht, die unnötiges Kopieren von Objekten verhindert.

Um Ihre Wörter zu verwenden, ist der "Variablenname" ein Speicherblock, der Daten enthält. Der Verweis ist wie ein Zeiger in dem Sinne, dass er auf einen anderen "Variablennamen" zeigt, aber er muss initialisiert werden und ist niemals Null.

  
  1. wie die Dinge in Option 1 und 2 anders funktionieren.
  2.   

Wie bereits erwähnt, ist Option 1 ein statischer Typ, wobei Option 2 auf eine Instanz eines abgeleiteten Objekts (von TestClass) verweisen kann.

  
  1. warum in beiden Fällen Objekte an unterschiedlichen Speicherorten erstellt werden.
  2.   

Obwohl sie "identische" TestObjects (100) sind, sind sie einzelne Instanzen und daher in verschiedenen Speichern (Adressen)

    
Caribou 03.11.2012 23:30
quelle

Tags und Links