|
1 | 1 | ---
|
2 | 2 | title: "Assignment operators"
|
3 | 3 | description: "The C++ standard language assignment operators syntax and use."
|
4 |
| -ms.date: 07/24/2020 |
| 4 | +ms.date: 02/23/2024 |
5 | 5 | f1_keywords: ["=", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|="]
|
6 | 6 | helpviewer_keywords: ["operators [C++], assignment", "assignment operators [C++], C++", "&= operator", "^= operator", "+= operator", ">>= operator", "|= operator", "operator>>=", "*= operator", "%= operator", "^= operator", "operator >>=", "= operator", "-= operator", "/= operator", "<<= operator"]
|
7 | 7 | ms.assetid: b028cf35-2ff1-4f14-9027-fd53ebec8aa0
|
@@ -83,7 +83,7 @@ The simple assignment operator (**`=`**) causes the value of the second operand
|
83 | 83 |
|
84 | 84 | Objects of **`const`** and **`volatile`** types can be assigned to l-values of types that are only **`volatile`**, or that aren't **`const`** or **`volatile`**.
|
85 | 85 |
|
86 |
| -Assignment to objects of class type (**`struct`**, **`union`**, and **`class`** types) is performed by a function named `operator=`. The default behavior of this operator function is to perform a bitwise copy; however, this behavior can be modified using overloaded operators. For more information, see [Operator overloading](../cpp/operator-overloading.md). Class types can also have *copy assignment* and *move assignment* operators. For more information, see [Copy constructors and copy assignment operators](copy-constructors-and-copy-assignment-operators-cpp.md) and [Move constructors and move assignment operators](move-constructors-and-move-assignment-operators-cpp.md). |
| 86 | +Assignment to objects of class type (**`struct`**, **`union`**, and **`class`** types) is performed by a function named `operator=`. The default behavior of this operator function is to perform a member-wise copy assignment of the object's non-static data members and direct base classes; however, this behavior can be modified using overloaded operators. For more information, see [Operator overloading](../cpp/operator-overloading.md). Class types can also have *copy assignment* and *move assignment* operators. For more information, see [Copy constructors and copy assignment operators](copy-constructors-and-copy-assignment-operators-cpp.md) and [Move constructors and move assignment operators](move-constructors-and-move-assignment-operators-cpp.md). |
87 | 87 |
|
88 | 88 | An object of any unambiguously derived class from a given base class can be assigned to an object of the base class. The reverse isn't true because there's an implicit conversion from derived class to base class, but not from base class to derived class. For example:
|
89 | 89 |
|
@@ -154,13 +154,15 @@ The compound assignment operators are shown in the [Assignment operators table](
|
154 | 154 |
|
155 | 155 | - a pointer, if *op* is **`+`** or **`-`**
|
156 | 156 |
|
157 |
| -The *e1* *op*= *e2* form behaves as *e1* **`=`** *e1* *op* *e2*, but *e1* is evaluated only once. |
| 157 | +- a type for which there exists a matching `operator *op*=` overload for the type of *e1* |
| 158 | + |
| 159 | +The built-in *e1* *op*= *e2* form behaves as *e1* **`=`** *e1* *op* *e2*, but *e1* is evaluated only once. |
158 | 160 |
|
159 | 161 | Compound assignment to an enumerated type generates an error message. If the left operand is of a pointer type, the right operand must be of a pointer type, or it must be a constant expression that evaluates to 0. When the left operand is of an integral type, the right operand must not be of a pointer type.
|
160 | 162 |
|
161 |
| -## Result of assignment operators |
| 163 | +## Result of built-in assignment operators |
162 | 164 |
|
163 |
| -The assignment operators return the value of the object specified by the left operand after the assignment. The resultant type is the type of the left operand. The result of an assignment expression is always an l-value. These operators have right-to-left associativity. The left operand must be a modifiable l-value. |
| 165 | +The built-in assignment operators return the value of the object specified by the left operand after the assignment (and the arithmetic/logical operation in the case of compound assignment operators). The resultant type is the type of the left operand. The result of an assignment expression is always an l-value. These operators have right-to-left associativity. The left operand must be a modifiable l-value. |
164 | 166 |
|
165 | 167 | In ANSI C, the result of an assignment expression isn't an l-value. That means the legal C++ expression `(a += b) += c` isn't allowed in C.
|
166 | 168 |
|
|
0 commit comments