Operator Overloading Friend Functions - PowerPoint PPT Presentation

1 / 18
About This Presentation
Title:

Operator Overloading Friend Functions

Description:

Department of Computer and Information Science, School of Science, IUPUI Operator Overloading Friend Functions & Special Forms Dale Roberts, Lecturer – PowerPoint PPT presentation

Number of Views:219
Avg rating:3.0/5.0
Slides: 19
Provided by: DaleR163
Category:

less

Transcript and Presenter's Notes

Title: Operator Overloading Friend Functions


1
Operator 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
2
Operator 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.
3
Operator 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

4
Global 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

5
Overloading 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

6
Operators 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

7
Prefix 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

8
Postfix 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

9
Postfix 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 ().

10
Special 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

11
Overloading 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
15
Converting 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()

16
Converting 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

17
Special overloading forms - Example
  • Special Forms Example

18
Acknowledgements
  • 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.
Write a Comment
User Comments (0)
About PowerShow.com