Operator Overloading
suggest changeIntroduction
In C++, it is possible to define operators such as \+
and ->
for user-defined types. For example, the <string>
header defines a \+
operator to concatenate strings. This is done by defining an operator function using the operator
keyword.
Remarks
The operators for built-in types cannot be changed, operators can only be overloaded for user-defined types. That is, at least one of the operands has to be of a user-defined type.
The following operators cannot be overloaded:
- The member access or “dot” operator
.
- The pointer to member access operator
.*
- The scope resolution operator,
::
- The ternary conditional operator,
?:
dynamic_cast
,static_cast
,reinterpret_cast
,const_cast
,typeid
,sizeof
,alignof
, andnoexcept
- The preprocessing directives,
\#
and##
, which are executed before any type information is available.
There are some operators that you should not (99.98% of the time) overload:
&&
and||
(prefer, instead, to use implicit conversion tobool
),
- The address-of operator (unary
&
)
Why? Because they overload operators that another programmer might never expect, resulting in different behavior than anticipated.
For example, the user defined &&
and ||
overloads of these operators lose their short-circuit evaluation and lose their special sequencing properties (C++17), the sequencing issue also applies to ,
operator overloads.