Assignment operators modify the value of the object.
Operator name Syntax Overloadable Prototype examples (for class T) Inside class definition Outside class definition simple assignmenta = b
Yes T& T::operator =(const T2& b); N/A addition assignment a += b
Yes T& T::operator +=(const T2& b); T& operator +=(T& a, const T2& b); subtraction assignment a -= b
Yes T& T::operator -=(const T2& b); T& operator -=(T& a, const T2& b); multiplication assignment a *= b
Yes T& T::operator *=(const T2& b); T& operator *=(T& a, const T2& b); division assignment a /= b
Yes T& T::operator /=(const T2& b); T& operator /=(T& a, const T2& b); remainder assignment a %= b
Yes T& T::operator %=(const T2& b); T& operator %=(T& a, const T2& b); bitwise AND assignment a &= b
Yes T& T::operator &=(const T2& b); T& operator &=(T& a, const T2& b); bitwise OR assignment a |= b
Yes T& T::operator |=(const T2& b); T& operator |=(T& a, const T2& b); bitwise XOR assignment a ^= b
Yes T& T::operator ^=(const T2& b); T& operator ^=(T& a, const T2& b); bitwise left shift assignment a <<= b
Yes T& T::operator <<=(const T2& b); T& operator <<=(T& a, const T2& b); bitwise right shift assignment a >>= b
Yes T& T::operator >>=(const T2& b); T& operator >>=(T& a, const T2& b);
T2
can be any type including T
.Copy assignment replaces the contents of the object a with a copy of the contents of b (b is not modified). For class types, this is performed in a special member function, described in copy assignment operator.
Move assignment replaces the contents of the object a with the contents of b, avoiding copying if possible (b may be modified). For class types, this is performed in a special member function, described in move assignment operator.
(since C++11)For non-class types, copy and move assignment are indistinguishable and are referred to as direct assignment.
Compound assignment replace the contents of the object a with the result of a binary operation between the previous value of a and the value of b.
[edit] Assignment operator syntaxThe assignment expressions have the form
target-expr=
new-value (1) target-expr op new-value (2) target-expr - the expression[1] to be assigned to op - one of *=, /= %=, += -=, <<=, >>=, &=, ^=, |= new-value - the expression[2](until C++11)initializer clause(since C++11) to assign to the target
1) Simple assignment expression.
2) Compound assignment expression.
If new-value is not an expression, the assignment expression will never match an overloaded compound assignment operator.
(since C++11) [edit] Built-in simple assignment operatorFor the built-in simple assignment, target-expr must be a modifiable lvalue.
The object referred to by target-expr is modified by replacing its value with the result of new-value. If the object referred is of an integer type T
, and the result of new-value is of the corresponding signed/unsigned integer type, the value of the object is replaced with the value of type T
with the same value representation of the result of new-value.
The result of a built-in simple assignment is an lvalue of the type of target-expr, referring to target-expr. If target-expr is a bit-field, the result is also a bit-field.
[edit] Assignment from an expressionIf new-value is an expression, it is implicitly converted to the cv-unqualified type of target-expr. When target-expr is a bit-field that cannot represent the value of the expression, the resulting value of the bit-field is implementation-defined.
If target-expr and new-value identify overlapping objects, the behavior is undefined (unless the overlap is exact and the type is the same).
Assignment from a non-expression initializer clausenew-value is only allowed not to be an expression in following situations:
T
, and new-value is empty or has only one element. In this case, given an invented variable t declared and initialized as T t =
new-value , the meaning of x =
new-value is x = t.#include <complex> std::complex<double> z; z = {1, 2}; // meaning z.operator=({1, 2}) z += {1, 2}; // meaning z.operator+=({1, 2}) int a, b; a = b = {1}; // meaning a = b = 1; a = {1} = b; // syntax error(since C++11)
In overload resolution against user-defined operators, for every type T
, the following function signatures participate in overload resolution:
T*& operator=(T*&, T*);
T*volatile & operator=(T*volatile &, T*);
For every enumeration or pointer to member type T
, optionally volatile-qualified, the following function signature participates in overload resolution:
For every pair A1
and A2
, where A1
is an arithmetic type (optionally volatile-qualified) and A2
is a promoted arithmetic type, the following function signature participates in overload resolution:
The behavior of every built-in compound-assignment expression target-expr
op
=
new-value is exactly the same as the behavior of the expression target-expr
=
target-expr
op
new-value, except that target-expr is evaluated only once.
The requirements on target-expr and new-value of built-in simple assignment operators also apply. Furthermore:
In overload resolution against user-defined operators, for every pair A1
and A2
, where A1
is an arithmetic type (optionally volatile-qualified) and A2
is a promoted arithmetic type, the following function signatures participate in overload resolution:
A1& operator*=(A1&, A2);
A1& operator/=(A1&, A2);
A1& operator+=(A1&, A2);
A1& operator-=(A1&, A2);
For every pair I1
and I2
, where I1
is an integral type (optionally volatile-qualified) and I2
is a promoted integral type, the following function signatures participate in overload resolution:
I1& operator%=(I1&, I2);
I1& operator<<=(I1&, I2);
I1& operator>>=(I1&, I2);
I1& operator&=(I1&, I2);
I1& operator^=(I1&, I2);
I1& operator|=(I1&, I2);
For every optionally cv-qualified object type T
, the following function signatures participate in overload resolution:
#include <iostream> int main() { int n = 0; // not an assignment n = 1; // direct assignment std::cout << n << ' '; n = {}; // zero-initialization, then assignment std::cout << n << ' '; n = 'a'; // integral promotion, then assignment std::cout << n << ' '; n = {'b'}; // explicit cast, then assignment std::cout << n << ' '; n = 1.0; // floating-point conversion, then assignment std::cout << n << ' '; // n = {1.0}; // compiler error (narrowing conversion) int& r = n; // not an assignment r = 2; // assignment through reference std::cout << n << ' '; int* p; p = &n; // direct assignment p = nullptr; // null-pointer conversion, then assignment std::cout << p << ' '; struct { int a; std::string s; } obj; obj = {1, "abc"}; // assignment from a braced-init-list std::cout << obj.a << ':' << obj.s << '\n'; }
Possible output:
1 0 97 98 1 2 (nil) 1:abc[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior CWG 1527 C++11 for assignments to class type objects, the right operandT
is the type of E1
), this introduced a C-style cast it is equivalent
a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b
++a
--a
a++
a--
+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b
!a
a && b
a || b
a == b
a != b
a < b
a > b
a <= b
a >= b
a <=> b
a[...]
*a
&a
a->b
a.b
a->*b
a.*b
a(...)
commaa, b
conditionala ? b : c
Special operatorsstatic_cast converts one type to another related type
dynamic_cast converts within inheritance hierarchies
const_cast adds or removes cv-qualifiers
reinterpret_cast converts type to unrelated type
C-style cast converts one type to another by a mix of static_cast, const_cast, and reinterpret_cast
new creates objects with dynamic storage duration
delete destructs objects previously created by the new expression and releases obtained memory area
sizeof queries the size of a type
sizeof... queries the size of a pack (since C++11)
typeid queries the type information of a type
noexcept checks if an expression can throw an exception (since C++11)
alignof queries alignment requirements of a type (since C++11)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4