Title: Operator Overloading
1Operator Overloading
Department of Computer and Information
Science,School of Science, IUPUI
Dale Roberts, Lecturer Computer Science,
IUPUI E-mail droberts_at_cs.iupui.edu
2Operator Overloading
- Function-call notation is cumbersome for certain
kinds of classes, especially mathematical classes
- Allows extendable design
- Most appropriate for math classes. eg. Matrix,
Vector, etc. - Gives Operators Class-Specific Functionality
- In-built or Standard Overloading for Basic
Numerical Data Types -- can be used with int,
float, doubles - Analogous to Function Overloading -- operator_at_ is
Used as the Function Name - 40 Operators can be Overloaded to Give
Class-Specific Functionality -
- C enables programmers to overload operators to
be sensitive to the context in which they are
used. The compiler generates appropriate code - Easier to read
3Requirements of Overloaded Operators
- Their Meaning Should be Intuitive -- Should
Mean Addition - When Appropriate, they Should be Associative -- a
b Should Result in an Object, c of the Same
Class - If these Conditions are Not Satisfied then it is
Better to Use Member Functions and Not Operator
Overloading - To use an operator on class objects, that
operator must be overloaded - with two exceptions
- the assignment operator (), which performs a
member wise copy, and the address () operator
4Forms of Overloaded Operators
- Member Functions
- Friend Functions
- Free-Standing or Global Functions
5Operator Functions
- When to make class members, friends or global
functions? - If member function, then this is implicitly
available for one of the arguments - When overloading ( ), , -gt, or , the operator
overloading function must be declared as a class
member. For other operators, the overloading
functions can be non-members - When an operator function is implemented as a
member function, the left most (or only in the
case of unary operators) operand must be a class
object (or a reference to a class object) of
operator's class - If the left operand must be an object of a
different class or a built-in type, this operator
must be implemented as a non-class member. eg.
ltlt, gtgt operators - An operator function implemented as a non-member
must be a friend if it needs to access non-public
data members of that class. - The overloaded ltlt operator must have a left
operand of type ostream. Therefore, it must be a
non-member function. Also, it may require access
to the private data members of the class. Thus,
it needs to be a friend function for that class. - Similar observation holds for gtgt operator which
has a left operand of type istream. - Operator member functions are classed only when
the left operand of a binary operator is
specifically an object of that class or when the
single operand of a unary operator is an object
of that class. - If the operator needs to be commutative (a b
b a), then making it a non-member function is
necessary.
6Restrictions of Overloaded Operators
- New Operators CANNOT be Created
- Fundamental Data Types (e.g. int) CANNOT be
Overloaded - Operator Priority CANNOT be Changed
- Operator Associativity CANNOT be Changed
- The arity of CANNOT be changed -- can Take ONLY
One or TWO Arguments - Two Separate Overloaded Functions (With Different
Signatures) can be Created for Operators Which
Exist in Pre-fix and Post-fix Form -- - Overloaded Operators are NOT IMPLICITLY
Associative or Commutative, Even if the Original
Operators were Associative or Commutative --
Associativity and Commutativity MUST be
EXPLICITLY IMPLEMENTED - Overloading the operator does not automatically
overload related operators (, , etc). If
needed, these related operators must be
explicitly overloaded
7Unary Overloaded Operators -- Member Functions
- Invocation in Two Ways -- Object_at_ (Direct) or
Object.operator_at_() (As a Function) - class number
- int n
- public
- number(int x 0)n(x)
- number operator-()return number (-n)
-
- main()
-
- number a(1), b(2), c, d
- //Invocation of "-" Operator -- direct
- d -b //d.n -2
- //Invocation of "-" Operator -- Function
- c a.operator-() //c.n -1
-
8Binary Overloaded Operators -- Member Functions
- Invocation in Two Ways -- ObjectA _at_ ObjectB
(direct) or ObjectA.operator_at_(ObjectB) (As a
Function) - class number
- int n
- public
- number(int x 0)n(x)
- number operator(number ip)
- return number (ip.n n)
-
- main()
-
- number a(1), b(2), c, d
- //Invocation of "" Operator -- direct
- d a b //d.n 3
- //Invocation of "" Operator -- Function
- c d.operator(b) //c.n d.n b.n 5
-
9Operator Overloading Using a Friend Function
- Number of Parameters Accepted by an Overloaded
Friend Operator Function Depend Upon the Operator
Type -- One for Unary Operators and Two for
Binary Operators - class complex
- int re, im
- public
- complex(int ip1 0, int ip2 0)
- re(ip1), im(ip2)
- friend complex operator(complex,
complex) -
- //Friend Operator Function
- complex operator(complex a, complex b)
- return complex(a.reb.re, a.imb.im)
- main()
- complex one(1,1), two(2,2), three
- three operator(one, two) //three one
two -
10Operator Functions as Class Members vs. as friend
Functions
- Non-member overloaded operator functions
- Enable the operator to be commutative
-
- HugeInteger bigInteger
- int integer
- bigInteger integer bigInteger
-
- or
- bigInteger biginteger integer
11Global Operator Overloading
- Similar to friend Function Overloading, Except
the Keyword friend is Omitted and Global
Functions CANNOT ACCESS private Members - class complex //All Public Members!
- public
- int re, im
- complex(int ip1 0, int ip2 0)
- re(ip1), im(ip2)
-
- void operator!(complex a)
-
- int temp a.re a.re a.im a.im temp
- cout ltlt "Real " ltlt a.re ltlt endl
- cout ltlt "Imaginary " ltlt a.im ltlt endl
-
-
- main()
-
- complex one(1,2)
- operator!(one)
-
12Overloading of Operators Having a Variable Arity
- Operators Such as and - Can be Unary or Binary
- Overloading of Such Operators Involves Creating a
Unary Function (One Operand) and a Binary
Function (Two Operands) - Only if Both the Forms are Used, They Need to be
Implemented - class number
- int n
- public
- number(int x 0)n(x)
- number operator-()n -n return this
- number operator-(number ip)
return(n-ip.n) -
- main()
- number one(1), two(2), three
- one -one //unary operator
- three one - two //three.n -3
-
13Operators with Prefix and Postfix Forms
- Separate Functions for Each -- Prefix and Postfix
-- Forms are Needed - Prefix Form is Treated as an Unary Operator
- Postfix Form is Treated as a Binary Operator
14Prefix Overloaded Function -- Example
- class number
- int n
- public
- number(int x)n(x) //Constructor
- //prefix operator -- unary
- number operator()
-
- number numberoperator()
- n return this
- main()
- number one(10) //one.n 10
- one //one.n 11
-
15Postfix Overloaded Function -- Example
- Postfix Operator is Implemented as a Binary
Operator with an int Argument with a Default
Value of 0 - class number
- int n
- public
- number(int x)n(x) //Constructor
- //postfix operator -- binary -- int
argument - number operator(int)
-
- number numberoperator(int y)
- n y return this
- main()
-
- number one(10) //one.n 10
- one.operator(2) //one.n 12
-
16Special Overloading Forms
- A Few Operators Require Special Treatments During
Overloading - Conversion Operator
- const Array Operator
- Function Call -- Parenthesis Operator
- Stream Insertion -- ltlt Operator
- Stream Extraction -- gtgt Operator
- Pointer to Member -- -gt Operator
- Assignment Operator
- new Operator
- delete Operator
17Overloading Stream-Insertion and
Stream-Extraction Operators
- Overloaded ltlt and gtgt operators
- Must have left operand of types ostream ,
istream respectively - It must be a non-member function (left operand
not an object of the class) - It must be a friend function if it accesses
private data members
18(No Transcript)
19(No Transcript)
20 Enter phone number in the form (123)
456-7890 (800) 555-1212 The phone number entered
was (800) 555-1212
21Converting between Types
- Cast operator
- Convert objects into built-in types or other
objects - Conversion operator must be a non-static member
function. - Cannot be a friend function
- Do not specify return type
- For user-defined class A
- Aoperator char () const // A to char
- Aoperator int() const //A to int
- Aoperator otherClass() const //A to
otherClass - When compiler sees (char ) s it calls
- s.operator char()
22Converting between Types (cont)
- The compiler can call these functions to create
temporary objects. - If s is not of type char
- Calls Aoperator char () const for
- cout ltlt s
-
23Special overloading forms - Example
24Acknowledgements
- These slides were originally development by Dr.
Uday Murthy and Dr. Rajeev Raje. - Some contents comes from the Deitel slides that
accompany your text.