Download Operator Overloading: Extending Functionality of Mathematical Classes in C++ and more Slides Computer Science in PDF only on Docsity!
Operator Overloading
Member Functions
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
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 (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.
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
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 }