110 likes | 287 Views
Operator Overloading. Syntax. The general syntax is: [friend] returntype operator <operator symbol> ( <parameters> ) { <statements>; }. Syntax. The number of arguments in the overloaded operator’s argument list depends on two factors:
E N D
Syntax The general syntax is: [friend] returntype operator<operator symbol> ( <parameters> ) { <statements>; }
Syntax • The number of arguments in the overloaded operator’s argument list depends on two factors: • Whether it’s a unary operator (one argument) or a binary operator (two arguments). • Whether the operator is defined as a global function (one argument for unary, two for binary) or a member function (zero arguments for unary, one for binary – the object becomes the left-hand argument).
Operators that can’t be overloaded • All operators can be overloaded except for the ones below: • The member selection operator - . • The pointer to member dereference operator- .* • Scope access/resolution operator - :: • Conditional operator - ?: • Also, there are no user-defined operators and you can’t change the precedence rules.
Overloaded operators as member or non-member functions? • The decision is based on what argument(s) is needed by the operator. • In general, if it doesn’t make any difference, they should be members, to emphasize the association between the operator and its class. • When the left-hand operand is always an object of the current class, this works fine. • Sometimes you want the left-hand operand to be an object of some other class, then the overloaded operator cannot be a member function.
Some ”tricky” operators • Increment and decrement operators • ++a (a pre-increment) generates a call to operator++(a); • a++ (a post-increment) generates a call to operator++(a,int)for non-member functions. • The member function versions, would be: • B::operator++( ); and • B::operator++(int); • Note: a dummy value is passed by the compiler to distinguish (generate different signatures) the two versions.
Some ”tricky” operators • The assignment operator • Defining the assignment operator has a lot in common with defining the copy constructor and the destructor. List& List::operator=( const List& b ) { if( this != &b) //check for self assignment { free(); copy(b); } return *this; }
An example • Let’s look at our example implementation of the class ’Values’
Arguments and return values • Guidelines • Return by value as const • The return value optimization