C++ Operators

C++ supports a lot of operators! These include operators that you likely think of, such as arithmetic and logical operators, as well as conversion operators.

Both C++ and Ruby support operator overriding, although C++ supports more of them. The sections below describe how to map C++ operators to Ruby operators.

Arithmetic Operators

Most overridden C++ arithmetic operators can be overridden in Ruby.

C++

Ruby

+

+

-

-

*

*

/

/

%

%

++

Not overridable

Not overridable

Assignment Operators

Ruby does not support overriding assignment operators.

C++

Ruby

=

assign

+=

Not overridable

-=

Not overridable

*=

Not overridable

/=

Not overridable

%=

Not overridable

Bitwise Operators

C++ and Ruby support overriding the same bitwise operators.

C++

Ruby

&

&

|

|

~

~

<<

<<

>>

>>

Comparison (Relational) Operators

C++ and Ruby support overriding the same comparison operators.

C++

Ruby

==

==

!=

!=

>

<

<

>

>=

>=

<=

<=

Logical Operators

Ruby allows the ! operator to be overridden but not && or ||.

C++

Ruby

&&

Not overridable

||

Not overridable

!

!

Other Operators

C++ and Ruby support overriding an additional set of operators.

C++

Ruby

[]

[]

[]= (if reference)

()

call

,

Not overridable

<<

<<

>>

>>

If a C++ class defines an [] operator that returns a reference, then in it should be mapped to two Ruby operators: [] and []=.

C++ classes that support the () operator are known as functors. Ruby supports overriding the .() operator by defining a call function. Note this isn’t quite the same as C++ because it is invoked via .() and not () – notice the . before the ().

Conversion Operators

C++ allows users to define explicit and implicit conversion operators or functions. These are used to convert a class to a different types. For example:

class Money
{
public:
    Money(float amount);
    operator float() const;
};

The operator double() const; is a user defined conversion function that converts a Money instance to a double. Following Ruby conventions, these conversion functions should be exposed as to_ method, in this case to_f.