140 likes | 154 Views
Understand the power of operator overloading in C++, its requirements, forms, restrictions, and practical implementations with examples. Enhance class-specific functionality and design flexibility.
E N D
Department of Computer and Information Science,School of Science, IUPUI Operator OverloadingMember Functions Dale Roberts, Lecturer Computer Science, IUPUI E-mail: droberts@cs.iupui.edu
Operator 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@ is Used as the Function Name • 40 Operators can be Overloaded to Give Class-Specific Functionality
Operator 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
Requirements 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
Forms of Overloaded Operators • Member Functions • Friend Functions • Free-Standing or Global Functions
Operator 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 ( ), [ ], ->, or =, the operator overloading function must be declared as a class member. For other operators, the overloading functions can be non-members
Operator 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. <<, >> operators
Operator 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 << 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.
Operator Functions (Cont) • Similar observation holds for >> 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.
Restrictions 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 -- ++
Restrictions 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
Unary Overloaded Operators -- Member Functions • Invocation in Two Ways -- Object@ (Direct) or Object.operator@() (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 }
Binary Overloaded Operators -- Member Functions • Invocation in Two Ways -- ObjectA @ ObjectB (direct) or ObjectA.operator@(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 }
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.