Freigeben über


Initialisieren von Verweisen

Variablen des Referenztyps müssen mit einem Objekt des Typs, von dem der Referenztyp abgeleitet wird, oder mit einem Objekt eines Typs initialisiert werden, der in den Typ konvertiert werden kann, von dem der Referenztyp abgeleitet wird. Beispiel:

// initializing_references.cpp
int iVar;
long lVar;
int main() {
   long& LongRef1 = lVar;   // No conversion required.
   long& LongRef2 = iVar;   // C2440
   const long& LongRef3 = iVar;   // OK
   LongRef1 = 23L;   // Change lVar through a reference.
   LongRef2 = 11L;   // Change iVar through a reference.
   LongRef3 = 11L;   // C3892
}

Die einzige Möglichkeit, einen Verweis mit einem temporären Objekt zu initialisieren, besteht darin, ein konstantes temporäres Objekt zu initialisieren. Nach der Initialisierung zeigt eine Referenztypvariable immer auf das gleiche Objekt. Sie kann nicht geändert werden und auf ein anderes Objekt zeigen.

Obwohl die Syntax identisch sein kann, sind die Initialisierung von Referenztypvariablen und die Zuweisung zu Referenztypvariablen semantisch unterschiedlich. Im vorherigen Beispiel ähneln die Zuweisungen, die iVar und lVar ändern, den Initialisierungen zwar, haben jedoch unterschiedliche Auswirkungen. Die Initialisierung gibt das Objekt an, auf das die Referenztypvariable zeigt. Die Zuweisung weist über die Referenz auf das verwiesene Objekt hin.

Da beide ein Argument des Referenztyps an eine Funktion übergeben und einen Wert des Referenztyps einer Funktion zurückgeben und daher Initialisierungen sind, werden die formalen Argumente einer Funktion ebenso korrekt initialisiert wie die zurückgegebenen Verweise.

Referenztypvariablen können ohne Initialisierer nur in folgenden Objekten deklariert werden:

  • Funktionsdeklarationen (Prototypen). Beispiel:

    int func( int& );
    
  • Funktionsrückgabetyp-Deklarationen. Beispiel:

    int& func( int& );
    
  • Deklaration eines Referenztypklassenmembers. Beispiel:

    class c {
    public:
       int& i;
    };
    
  • Deklaration einer Variable, die explizit als extern deklariert wird. Beispiel:

    extern int& iVal;
    

Bei der Initialisierung einer Referenztypvariable verwendet der Compiler das Entscheidungsdiagramm, wie in der folgenden Abbildung gezeigt, um zwischen dem Erstellen eines Verweises auf ein Objekt und dem Erstellen eines temporären Objekts auszuwählen, auf das der Verweis zeigt.

Entscheidungsdiagramm zur Initialisierung von Verweistypen

Entscheidungsdiagramm für die Initialisierung von Verweistypen

Verweise auf volatile-Typen (die als volatile typename**&** identifierdeklariert sind) können mit volatile-Objekten desselben Typs oder mit Objekten initialisiert werden, die nicht als volatile deklariert wurden. Sie können jedoch nicht mit const-Objekten dieses Typs initialisiert werden. Entsprechend können Verweise auf const-Typen (die als const typename**&** identifierdeklariert sind) mit const-Objekten desselben Typs (oder mit Objekten, die eine Konvertierung auf diesen Typ aufweisen, oder mit Objekten, die nicht als const deklariert wurden) initialisiert werden. Sie können jedoch nicht mit volatile-Objekten dieses Typs initialisiert werden.

Verweise, die weder mit dem Schlüsselwort const noch mit dem Schlüsselwort volatile qualifiziert werden, können nur mit Objekten initialisiert werden, die weder als const noch als volatile deklariert werden.

Siehe auch

Referenz

Initialisierer