Title: Operator Overloading Member Functions
1Operator Overloading
Member Functions
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 -
3Operator Overloading (Cont)
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
4Requirements 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
5Forms of Overloaded Operators
- Member Functions
- Friend Functions
- Free-Standing or Global Functions
6Operator 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
7Operator Functions (Cont)
- 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
8Operator Functions (cont)
- 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.
9Operator Functions (Cont)
- 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.
10Restrictions 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
TWO Arguments (there is no unary ) - Two Separate Overloaded Functions (With Different
Signatures) can be Created for Operators Which
Exist in Pre-fix and Post-fix Form --
11Restrictions of Overloaded Operators (Cont)
- Overloaded Operators are NOT IMPLICITLY
Associative or Commutative, Even if the Original
Operators were Associative or Commutative --
Associativity and Commutativity must be
explicitly implemented. For Associativity this
means returning an instance of the class. - Overloading the operator does not automatically
overload related operators (, , etc). If
needed, these related operators must be
explicitly overloaded
12Unary 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
-
13Binary 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
-
14Acknowledgements
- 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.