Assignment operators (Zuweisungsoperatoren)

Syntax

expression assignment-operator expression

assignment-operator: einer von
=*=/=%=+=-=<<=>>=&=^=|=

Hinweise

Zuweisungsoperatoren speichern einen Wert in dem Objekt, das durch den linken Operanden angegeben wird. Es gibt zwei Arten von Zuordnungsvorgängen:

  • Einfache Zuweisung, wobei Sie den Wert des zweiten Operanden in dem Objekt speichern, das durch den ersten Operanden angegeben wird.

  • Zusammengesetzte Zuweisung, wobei vor dem Speichern des Ergebnisses ein arithmetischer, Verschiebe- oder bitweiser Vorgang ausgeführt wird.

Alle Zuweisungsoperatoren in der folgenden Tabelle, mit Ausnahme des Operators =, sind Operatoren für zusammengesetzte Zuweisungen.

Tabelle mit Zuordnungsoperatoren

Operator Bedeutung
= Speichern Sie den Wert des zweiten Operanden in dem Objekt, das durch den ersten Operanden angegeben wird (einfache Zuweisung).
*= Multiplizieren Sie den Wert des ersten Operanden mit dem Wert des zweiten Operanden. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
/= Dividieren Sie den Wert des ersten Operanden durch den Wert des zweiten Operanden. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
%= Errechnen Sie den Modul des ersten Operanden, der vom Wert des zweiten Operanden angegeben wird. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
+= Addieren Sie den Wert des zweiten Operanden zu dem Wert des ersten Operanden. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
-= Subtrahieren Sie den Wert des zweiten Operanden von dem Wert des ersten Operanden. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
<<= Verschieben Sie den Wert des ersten Operanden links der Anzahl von Bits, die durch den Wert des zweiten Operanden angegeben werden. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
>>= Verschieben Sie den Wert des ersten Operanden rechts der Anzahl von Bits, die durch den Wert des zweiten Operanden angegeben werden. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
&= Rufen Sie den bitweisen AND-Operator des ersten und zweiten Operanden auf. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
^= Rufen Sie den bitweisen exklusiven OR-Operator des ersten und zweiten Operanden auf. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.
|= Rufen Sie den bitweisen inklusiven OR-Operator des ersten und zweiten Operanden auf. Speichern Sie das Ergebnis in dem Objekt, das durch den ersten Operanden angegeben wird.

Operatorschlüsselwörter

Drei der zusammengesetzten Zuweisungsoperatoren haben Schlüsselwortentsprechungen. Es sind:

Operator Entsprechung
&= and_eq
|= or_eq
^= xor_eq

C++ gibt diese Operatorschlüsselwörter als alternative Schreibweisen für die zusammengesetzten Zuordnungsoperatoren an. In C werden die alternativen Schreibweisen als Makros im <iso646.h>-Header bereitgestellt. In C++ sind die alternativen Schreibweisen Schlüsselwörter. Die Verwendung von <iso646.h> oder das C++-Äquivalent <ciso646> ist veraltet. In Microsoft C++ ist die Compileroption /permissive- oder /Za erforderlich, um die alternative Schreibweise zu aktivieren.

Beispiel

// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include <iostream>
using namespace std;
int main() {
   int a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555;

   a += b;      // a is 9
   b %= a;      // b is 6
   c >>= 1;      // c is 5
   d |= e;      // Bitwise--d is 0xFFFF

   cout  << "a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555" << endl
         << "a += b yields " << a << endl
         << "b %= a yields " << b << endl
         << "c >>= 1 yields " << c << endl
         << "d |= e yields " << hex << d << endl;
}

Einfache Zuweisung

Der einfache Zuweisungsoperator (=) bewirkt, dass der Wert des zweiten Operanden in dem durch den ersten Operanden angegebenen Objekt gespeichert wird. Wenn beide Objekte arithmetische Typen sind, wird der rechte Operand in den Typ des linken Operanden konvertiert, bevor der Wert gespeichert wird.

Objekte vom Typ const und volatile können l-values von Typen zugewiesen werden, die nur volatile sind oder nicht const oder volatile sind.

Die Zuordnung zu Objekten vom Klassentyp (Typen struct, union und class) wird von einer Funktion namens operator= ausgeführt. Das Standardverhalten dieser Operatorfunktion besteht darin, eine elementweise Kopierzuweisung der nicht statischen Datenelemente und direkten Basisklassen des Objekts auszuführen. Dieses Verhalten kann jedoch mithilfe überladener Operatoren geändert werden. Weitere Informationen finden Sie unter Operatorüberladung. Klassentypen können auch Kopierzuweisungs- und Verschiebungsoperatoren enthalten. Weitere Informationen finden Sie unter Kopierkonstruktoren und Kopierzuweisungsoperatoren und Verschiebekonstruktoren und Verschiebezuweisungsoperatoren.

Ein Objekt einer eindeutig abgeleiteten Klasse von einer angegebenen Basisklasse kann einem Objekt der Basisklasse zugewiesen werden. Umgekehrt gilt dies nicht, weil eine implizite Konvertierung von einer abgeleiteten Klasse in eine Basisklasse erfolgt, jedoch nicht von der Basisklasse in die abgeleitete Klasse. Beispiel:

// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
    ABase() { cout << "constructing ABase\n"; }
};

class ADerived : public ABase
{
public:
    ADerived() { cout << "constructing ADerived\n"; }
};

int main()
{
    ABase aBase;
    ADerived aDerived;

    aBase = aDerived; // OK
    aDerived = aBase; // C2679
}

Zuweisungen zu Verweistypen verhalten sich so, als ob die Zuweisung zu dem Objekt ausgeführt würde, auf das der Verweis zeigt.

Für Klassentypobjekte unterscheidet sich die Zuweisung von der Initialisierung. Um zu sehen, wie unterschiedlich Zuweisung und Initialisierung sein können, betrachten Sie diesen Code:

UserType1 A;
UserType2 B = A;

Der vorhergehende Code zeigt einen Initialisierer; er ruft den Konstruktor für UserType2 auf, der ein Argument vom Typ UserType1 akzeptiert. Mit dem Code

UserType1 A;
UserType2 B;

B = A;

kann die Zuweisungsanweisung

B = A;

eine der folgenden Auswirkungen haben:

  • Rufen Sie die Funktion operator= für UserType2 auf, vorausgesetzt, operator= wird mit dem Argument UserType1 angegeben.

  • Aufruf der expliziten Konvertierungsfunktion UserType1::operator UserType2, wenn eine solche Funktion vorhanden ist.

  • Aufruf eines Konstruktors UserType2::UserType2, sofern ein solcher Konstruktor vorhanden ist, der ein UserType1-Argument akzeptiert und das Ergebnis kopiert.

Verbundzuweisung

Die zusammengesetzten Zuordnungsoperatoren sind in der Tabelle mit Zuordnungsoperatoren aufgeführt. Diese Operatoren haben das Format e1op= e2, wobei e1 ein nicht-const-modifizierbarer l-value ist und e2 Folgendes ist:

  • ein arithmetischer Typ

  • ein Zeiger, wenn op gleich + oder - ist

  • ein Typ, für den eine entsprechende operator *op*=-Überladung für den Typ e1 vorhanden ist

Das integrierte Format e1op= e2 verhält sich wie e1=e1ope2, doch wird e1 nur einmal ausgewertet.

Eine Verbundzuweisung für einen enumerierten Typ generiert eine Fehlermeldung. Wenn der linke Operand ein Zeigertyp ist, muss der rechte Operand ein Zeigertyp oder ein konstanter Ausdruck sein, der zu 0 ausgewertet wird. Wenn der linke Operand ein ganzzahliger Typ ist, darf der rechte Operand kein Zeigertyp sein.

Ergebnis der integrierten Zuordnungsoperatoren

Die integrierten Zuordnungsoperatoren geben den Wert des Objekts zurück, das vom linken Operanden nach der Zuordnung angegeben wird (und die arithmetische/logische Operation im Fall von zusammengesetzten Zuordnungsoperatoren). Das Typergebnis ist der Typ des linken Operanden. Das Ergebnis eines Zuweisungsausdrucks ist immer ein l-value. Diese Operatoren weisen eine Assoziativität von rechts nach links auf. Der linke Operand muss ein veränderbarer L-Wert sein.

In ANSI C ist das Ergebnis eines Zuweisungsausdrucks kein l-value. Das bedeutet, dass der zulässige C++-Ausdruck (a += b) += c in C nicht zulässig ist.

Siehe auch

Ausdrücke mit binären Operatoren
Integrierte C++-Operatoren, Rangfolge und Assoziativität
C-Zuweisungsoperatoren