C++ Operator Overloading


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.


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, and noexcept
  • 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 to bool)
  • ,
  • 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.