Operatory przypisania

Składnia

expression assignment-operator expression

assignment-operator: jeden z
=*=/=%=+=-=<<=>>=&=^=|=

Uwagi

Operatory przypisania przechowują wartość w obiekcie określonym przez lewy operand. Istnieją dwa rodzaje operacji przypisania:

  • proste przypisanie, w którym wartość drugiego operandu jest przechowywana w obiekcie określonym przez pierwszy operand.

  • przypisanie złożone, w którym jest wykonywana operacja arytmetyczna, shift lub bitowa przed zapisaniem wyniku.

Wszystkie operatory przypisania w poniższej tabeli z wyjątkiem = operatora są operatorami przypisania złożonego.

Tabela operatorów przypisania

Operator Znaczenie
= Przechowuje wartość drugiego operandu w obiekcie określonym przez pierwszy operand (przypisanie proste).
*= Mnoży wartość pierwszego operandu przez wartość drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
/= Dzieli wartość pierwszego operandu przez wartość drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
%= Wyznacza moduł wartości pierwszego operandu określonej przez wartość drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
+= Dodaje wartość drugiego operandu do wartości pierwszego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
-= Odejmuje wartość drugiego operandu od wartości pierwszego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
<<= Przesuwa wartość pierwszego operandu w lewo o liczbę bitów określoną przez wartość drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
>>= Przesuwa wartość pierwszego operandu w prawo o liczbę bitów określoną przez wartość drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
&= Uzyskuje bitowe AND pierwszego i drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
^= Uzyskuje bitowe wykluczające OR pierwszego i drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.
|= Uzyskuje bitowe zawierające OR pierwszego i drugiego operandu; przechowuje wynik w obiekcie określonym przez pierwszy operand.

Słowa kluczowe operatora

Trzy operatory przypisania złożonego mają odpowiedniki słów kluczowych. Są to:

Operator Odpowiednik
&= and_eq
|= or_eq
^= xor_eq

Język C++ określa te słowa kluczowe operatora jako alternatywne pisownia dla operatorów przypisania złożonego. W języku C alternatywne pisownie są udostępniane jako makra w nagłówku <iso646.h> . W języku C++alternatywne pisownie są słowami kluczowymi; użycie iso646.h> lub równoważnego <<ciso646> języka C++ jest przestarzałe. W języku Microsoft C++ /permissive- opcja lub /Za kompilatora jest wymagana do włączenia alternatywnej pisowni.

Przykład

// 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;
}

Proste przypisanie

Prosty operator przypisania (=) powoduje, że wartość drugiego operandu ma być przechowywana w obiekcie określonym przez pierwszy operand. Jeśli oba obiekty są typami arytmetycznymi, prawy operand jest konwertowany na typ lewej, przed zapisaniem wartości.

const Obiekty i volatile typy można przypisać do l-wartości typów, które są tylko volatile, lub które nie const są lub volatile.

Przypisanie do obiektów typu klasy (struct, unioni class typów) jest wykonywane przez funkcję o nazwie operator=. Domyślnym zachowaniem tej funkcji operatora jest wykonanie przypisania kopii mądrej składowej niestacjonanych składowych obiektu i bezpośrednich klas bazowych; można jednak zmodyfikować to zachowanie przy użyciu przeciążonych operatorów. Aby uzyskać więcej informacji, zobacz Przeciążenie operatora. Typy klas mogą również mieć operatory przypisania kopiowania i przenoszenia przypisania. Aby uzyskać więcej informacji, zobacz Kopiowanie konstruktorów i operatorów przypisania kopiowania oraz Przenoszenie konstruktorów i operatorów przypisania przenoszenia.

Obiekt dowolnej jednoznacznej klasy pochodnej od danej klasy bazowej może być przypisany do obiektu klasy bazowej. Odwrotnie nie ma wartości true, ponieważ istnieje niejawna konwersja z klasy pochodnej na klasę bazową, ale nie z klasy bazowej do klasy pochodnej. Na przykład:

// 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
}

Przydziały do typów referencyjnych zachowują się tak, jakby przypisanie zostało wykonane do obiektu, do którego wskazuje odwołanie.

Dla obiektów typu klasy, przypisanie różni się od inicjowania. Aby zilustrować jak różne może być przypisanie i inicjowanie, należy rozważyć kod

UserType1 A;
UserType2 B = A;

W poprzednim kodzie zaprezentowano inicjator; wywołuje on konstruktor dla UserType2, który pobiera argument typu UserType1 Dany kod

UserType1 A;
UserType2 B;

B = A;

instrukcja przypisania

B = A;

może mieć jeden z następujących efektów:

  • Wywołaj funkcję operator= dla UserType2parametru , podana operator= jest z argumentem UserType1 .

  • Wywołanie funkcji konwersji jawnej UserType1::operator UserType2, jeśli istnieje taka funkcja.

  • Wywołanie konstruktora UserType2::UserType2, jeśli taki konstruktor istnieje, który przyjmuje argument UserType1 i kopiuje wynik.

Przypisanie złożone

Operatory przypisania złożonego są wyświetlane w tabeli Operatory przypisania. Te operatory mają formę e1op= e2, gdzie e1 jest niemodyfikowalnąconst wartością l i e2:

  • typ arytmetyczny

  • wskaźnik, jeśli op jest + lub -

  • typ, dla którego istnieje pasujące operator *op*= przeciążenie typu e1

Wbudowany formularz e1op= e2 zachowuje się jako e1 e1=e1ope2, ale e1 jest oceniany tylko raz.

Przypisanie złożone do typu wyliczonego generuje komunikat o błędzie. Jeśli lewy operand ma typ wskaźnika, prawy operand musi być typem wskaźnika lub musi być wyrażeniem stałym, które daje wartość 0. Gdy lewy operand jest typu całkowitego, prawy operand nie może być typem wskaźnika.

Wynik wbudowanych operatorów przypisania

Wbudowane operatory przypisania zwracają wartość obiektu określonego przez lewy operand po przypisaniu (i operację arytmetyczną/logiczną w przypadku operatorów przypisania złożonego). Wynikowy typ jest typem lewego operandu. Wynik wyrażenia przypisania jest zawsze wartością l.. Te operatory mają skojarzenie od prawej do lewej. Lewy operand musi być modyfikowalną wartością l..

W języku ANSI C wynik wyrażenia przypisania nie jest wartością l. Oznacza to, że prawne wyrażenie (a += b) += c języka C++ nie jest dozwolone w języku C.

Zobacz też

Wyrażenia z operatorami binarnymi
Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Operatory przypisania języka C