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
, union
i 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=
dlaUserType2
parametru , podanaoperator=
jest z argumentemUserType1
.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 argumentUserType1
i kopiuje wynik.
Przypisanie złożone
Operatory przypisania złożonego są wyświetlane w tabeli Operatory przypisania. Te operatory mają formę e1 op= 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 e1 op= e2 zachowuje się jako e1 e1 =
e1 op e2, 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