Udostępnij za pośrednictwem


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

Obsługujący Znaczenie
= Zapisz wartość drugiego operandu w obiekcie określonym przez pierwszy operand (proste przypisanie).
*= Pomnóż wartość pierwszego operandu przez wartość drugiego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
/= Podziel wartość pierwszego operandu przez wartość drugiego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
%= Weź modulo pierwszego operandu określonego przez wartość drugiego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
+= Dodaj wartość drugiego operandu do wartości pierwszego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
-= Odejmij wartość drugiego operandu z wartości pierwszego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
<<= Przesunięcie wartości pierwszego operandu pozostawiło liczbę bitów określoną przez wartość drugiego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
>>= Przesunięcie wartości pierwszego operandu w prawo liczba bitów określonych przez wartość drugiego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
&= Uzyskaj bitowe AND pierwszych i drugich operandów; zapisz wynik w obiekcie określonym przez pierwszy operand.
^= Uzyskaj bitowo wyłączny OR pierwszego i drugiego operandu; zapisz wynik w obiekcie określonym przez pierwszy operand.
|= Uzyskaj bitowe or pierwszego i drugiego operandu; zapisz 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:

Obsługujący Równoważny
&= 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 każdej jednoznacznie pochodnej klasy z danej klasy bazowej można przypisać 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. 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
}

Przypisania do typów odwołań zachowują się tak, jakby przypisanie zostało wykonane do obiektu, do którego wskazuje odwołanie.

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

UserType1 A;
UserType2 B = A;

Powyższy kod przedstawia inicjator; wywołuje konstruktor, UserType2 który przyjmuje argument typu UserType1. Biorąc pod uwagę 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łaj funkcję UserType1::operator UserType2jawnej konwersji , jeśli taka funkcja istnieje.

  • Wywołaj konstruktor , pod warunkiem, że taki UserType2::UserType2konstruktor istnieje, który przyjmuje UserType1 argument 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 także

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