Title: Operator Overloading Friend Functions
1Operator Overloading Friend Functions
Special Forms
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 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 one two //three
operator(one, two) -
Is a friend function necessary in this case? No
because LH operand is an instance of the class.
3Operator 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
4Global 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)
- !one
-
5Overloading of Operators Having a Variable Arity
- Operators Such as - 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)
- n n ip.n return this
-
- main()
- number one(1), two(2), three
- one -one //unary operator
- three one - two //three.n -3
-
6Operators 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
7Prefix 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
-
8Postfix Overloaded Function -- Example
- Postfix Operator is Implemented as a Binary
Operator with an int Argument with a Default
Value of 0 . When specifying an overloaded
operator for the postfix form of the increment or
decrement operator, the additional argument must
be of type int specifying any other type
generates an error. - class number
- int n
- public
- number(int x)n(x) //Constructor
- //postfix operator -- binary -- int
argument - number operator(int)
-
- number numberoperator(int y)
- if (y ! 0) n y else n return
this -
9Postfix overloaded functionExample (Cont)
- main()
-
- number one(10) // one.n 10
- one // one.n 11
- one.operator(2) // one.n 13
-
- There is no syntax for using the increment or
decrement operators to pass these values other
than explicit invocation, as shown in the
preceding code. A more straightforward way to
implement this functionality is to overload the
addition/assignment operator ().
10Special 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
11Overloading 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
12(No Transcript)
13(No Transcript)
14 Enter phone number in the form (123)
456-7890 (800) 555-1212 The phone number entered
was (800) 555-1212
15Converting 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()
16Converting 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
-
17Special overloading forms - Example
18Acknowledgements
- These slides were originally development by Dr.
Uday Murthy and Dr. Rajeev Raje. - Some contents comes from the Deitel slides that
accompany your text. - Some information regarding the postfix form the
increment and decrement operators comes from MSDN.