Language > Objects > Operator Overloading > Overloadable Operators

# Overloadable Operators

The following table describes IDL’s operators and provides information on the object method you must implement in order to override each for a custom object class.

Operator | Non-Overloaded Operation | Operator Type | Object Method Name | Function or Procedure
++ | Increment | Unary | Not overloadable | N/A
-- | Decrement | Unary | Not overloadable | N/A
[ ] | Indexing, right side | Unary | _overloadBracketsRightSide (see Overloading the Array Indexing Operator for additional details) | Function
[ ] | Indexing, left side | Unary | _overloadBracketsLeftSide (see Overloading the Array Indexing Operator for additional details) | Procedure
- | Negate | Unary | _overloadMinusUnary | Function
NOT | Bitwise NOT | Unary | _overloadNOT | Function
~ | Logical NOT | Unary | _overloadTilde | Function
+ | Addition | Binary | _overloadPlus | Function
- | Subtraction | Binary | _overloadMinus | Function
* | Multiplication | Binary | _overloadAsterisk | Function
/ | Division | Binary | _overloadSlash | Function
^ | Exponentiation | Binary | _overloadCaret | Function
MOD | Modulo | Binary | _overloadMOD | Function
< | Minimum | Binary | _overloadLessThan | Function
> | Maximum | Binary | _overloadGreaterThan | Function
AND | Bitwise AND | Binary | _overloadAND | Function
OR | Bitwise OR | Binary | _overloadOR | Function
XOR | Bitwise XOR | Binary | _overloadXOR | Function
EQ | Relational Equal | Binary | _overloadEQ | Function
NE | Relational Not Equal | Binary | _overloadNE | Function
GE | Greater Than or Equal | Binary | _overloadGE | Function
GT | Greater Than | Binary | _overloadGT | Function
LE | Less Than or Equal | Binary | _overloadLE | Function
LT | Less Than | Binary | _overloadLT | Function
# | Matrix multiplication | Binary | _overloadPound | Function
## | Matrix Multiplication | Binary | _overloadPoundPound | Function
&& | Logical AND | Binary | Not overloadable, but respects truth value returned by _overloadIsTrue | N/A
|| | Logical OR | Binary | Not overloadable, but respects truth value returned by _overloadIsTrue | N/A
if (obj)... | Logical: obj_valid(obj) | Unary | Not overloadable, but respects truth value returned by _overloadIsTrue | Function
(? : ) | Conditional expression | Binary | Not overloadable, but respects truth value returned by _overloadIsTrue | N/A
* | Pointer dereference | Unary | Not overloadable | N/A
= | Assignment operator | Binary | Not overloadable | N/A
[ ] | Array concatenation | Unary | Not overloadable | N/A
(exp) | Grouping of expressions with parentheses | Unary | Not overloadable | N/A
. | Method invocation | Binary | Not overloadable | N/A
. | Property invocation | Binary | Not overloadable, but will call GetProperty or SetProperty | N/A

Note: The behavior of the LOGICAL_AND, LOGICAL_OR, and LOGICAL_TRUE functions is not affected by object operator overloading, but it does respect the truth values returned by the _overloadIsTrue function (see The -_overloadIsTrue Function for more information).

## Overloading Compound Assignment Operators

Compound assignment operators cannot be overloaded directly. They will be overloaded if the operator that is compounded is overloaded. For example, if the addition operator “+” is overloaded, “+=” will also be overloaded using the same user method.

## The _overloadIsTrue Function

By default, evaluating an object reference for TRUE or FALSE (as in an IF block) yields TRUE if the object reference is valid, and FALSE for null objects. However, you can change this default behavior by implementing the _overloadIsTrue function method. This method allows you to evaluate an object and use your own criteria to determine if its state is TRUE (1) or FALSE (0).

The signature of the `_overloadIsTrue` object method is:

FUNCTION className::_overloadIsTrue

; Determine whether the specified object meets the true

; criteria, and place a 1 or a 0 in truth_value

RETURN, truth_value

END

For example, you could create an object class called `highVoltage`, with a VOLTAGE property. You could implement the object’s _overloadIsTrue function to check the VOLTAGE property, and return TRUE if VOLTAGE is greater than or equal to 220 volts. The method definition might look something like this:

FUNCTION highVoltage::_overloadIsTrue

high_or_low = self->VOLTAGE GE 220 ? 1 : 0

RETURN, high_or_low

END

Supposing you instantiated an object of the `highVoltage` class in `ohighVoltage`, the evaluation code would look like this:

IF (ohighVoltage) THEN ...

Note that the _overloadIsTrue function is a unary routine. In an expression such as (obj1 || obj2) where both objects enable overloading, the _overloadIsTrue function of obj1 is called. If the first object’s _overloadIsTrue function returns TRUE, the logical OR operator short-circuits and the expression evaluates as TRUE. If the first object’s _overloadIsTrue function returns FALSE, the logical OR does not short-circuit, and the second object’s _overloadIsTrue function is called, whose result is used as the value of the entire expression.

The _overloadIsTrue method is called whenever an overloaded object’s truth value must be evaluated. Specifically, when an overloaded object appears in any of the following constructions:

- IF...THEN...ELSE statement
- WHILE...DO statement
- REPEAT...UNTIL statement
- Logical AND (`&&`)
- Logical OR (`||`)
- Conditional expression (`?:`)

## Overloadable Information Routines

In addition to the standard operators listed in the previous table, object classes that inherit from the IDL_Object class can customize the information returned by the following IDL routines:

Routine | Default Behavior | Object Method Name
HELP | Prints heap variable ID and object class name. | _overloadHelp
N_ELEMENTS | Always reports 1 for a scalar object. | _overloadSize
PRINT/PRINTF | Prints heap variable ID and object class name. | _overloadPrint
SIZE | Always reports information for a scalar object. | _overloadSize
Implied Print | Prints heap variable ID and object class name. | _overloadImpliedPrint

## Overloadable Program Control Statements

If your object inherits from the IDL_Object class, you can iterate through the elements of your object using the FOREACH statement. You are responsible for writing your object’s `::_overloadForeach` function method, which retrieves the value of the next object element in the iteration.