Operator Overloading CS 3370 – C++ Chapter 14.

Slides:



Advertisements
Similar presentations
Chapter 11 Operator Overloading; String and Array Objects Chapter 11 Operator Overloading; String and Array Objects Part I.
Advertisements

Operator Overloading Fundamentals
Chapter 14: Overloading and Templates C++ Programming: Program Design Including Data Structures, Fifth Edition.
Rossella Lau Lecture 10, DCO10105, Semester B, DCO10105 Object-Oriented Programming and Design  Lecture 10: Operator overload  Operator overload.
 2006 Pearson Education, Inc. All rights reserved Operator Overloading.
Operator Overloading in C++ Systems Programming. Systems Programming: Operator Overloading 22   Fundamentals of Operator Overloading   Restrictions.
Chapter 15: Operator Overloading
Operator OverloadingCS-2303, C-Term Operator Overloading CS-2303 System Programming Concepts (Slides include materials from The C Programming Language,
Operator Overloading 1. Introduction Let’s define a class for Complex numbers: class Complex { private: double real, image; public: Complex () : real(0.0),
Operator overloading Object Oriented Programming.
Operator Overloading in C++
CSE 332: C++ Overloading Overview of C++ Overloading Overloading occurs when the same operator or function name is used with different signatures Both.
Operatorsand Operators Overloading. Introduction C++ allows operators to be overloaded specifically for a user-defined class. Operator overloading offers.
Operator Overloads Part2. Issue Provide member +(int) operator Rational + int OK int + Rational Error.
Operator Overloading Operator Overloading allows a programmer to define new uses of the existing C/C++ operator symbols. –useful for defining common operations.
Computer Science Department CPS 235 Object Oriented Programming Paradigm Lecturer Aisha Khalid Khan Operator Overloading.
Overloading Operator MySting Example. Operator Overloading 1+2 Matrix M 1 + M 2 Using traditional operators with user-defined objects More convenient.
CSC241 Object-Oriented Programming (OOP) Lecture No. 8.
CPSC 252 Operator Overloading and Convert Constructors Page 1 Operator overloading We would like to assign an element to a vector or retrieve an element.
Operator Overloading Operator Overloading allows a programmer to define new types from the built-in types. –Operator Overloading is useful for redefining.
 2008 Pearson Education, Inc. All rights reserved Operator Overloading.
©Fraser Hutchinson & Cliff Green C++ Certificate Program C++ Intermediate Operator Overloading.
Chapter 11 Friends and Overloaded Operators. Introduction to function equal // Date.h #ifndef _DATE_H_ #define _DATE_H_ class CDate { public: CDate();
1 Today’s Objectives  Announcements Homework #3 is due on Monday, 10-Jul, however you can earn 10 bonus points for this HW if you turn it in on Wednesday,
1 More Operator Overloading Chapter Objectives You will be able to: Define and use an overloaded operator to output objects of your own classes.
Operator Overloading. Binary operators Unary operators Conversion Operators –Proxy Classes bitset example Special operators –Indexing –Pre-post increment/decrement.
Operator Overloading Moshe Fresko Bar-Ilan University Object Oriented Programing
Learning Objectives Fundamentals of Operator Overloading. Restrictions of Operator Overloading. Global and member Operator. Overloading Stream-Insertion.
1 CISC181 Introduction to Computer Science Dr. McCoy Lecture 26 Clicker Questions December 3, 2009.
 Binary operators  Unary operators  Conversion Operators  Proxy Classes (simulating a reference) ▪ bitset example  Special operators  Indexing 
CS 342: C++ Overloading Copyright © 2004 Dept. of Computer Science and Engineering, Washington University Overview of C++ Overloading Overloading occurs.
Object-Oriented Programming Review 1. Object-Oriented Programming Object-Oriented Programming languages vary but generally all support the following features:
Operator Overloading.
Chapter 18 - C++ Operator Overloading
Object-Oriented Programming (OOP) Lecture No. 16
Andy Wang Object Oriented Programming in C++ COP 3330
CSE1002 – Problem Solving with Object Oriented Programming
Operator Overloading Introduction
Overloading C++ supports the concept of overloading Two main types
Reference Parameters There are two ways to pass arguments to functions: pass- by-value and pass-by-reference. pass-by-value A copy of the argument’s value.
Chapter 13: Overloading and Templates
Department of Computer and Information Science, School of Science, IUPUI Operator Overloading Dale Roberts, Lecturer Computer Science, IUPUI
Operator Overloading; String and Array Objects
C# Operator Overloading and Type Conversions
Chapter 1 C++ Basics Review
Visit for more Learning Resources
Polymorphism in C++ Operator Overloading
Object-Oriented Programming (OOP) Lecture No. 21
Pointers and Pointer-Based Strings
Object-Oriented Programming (OOP) Lecture No. 16
Jim Fawcett Copyright ©
Operator Overloading BCA Sem III K.I.R.A.S.
The dirty secrets of objects
Chapter 14: More About Classes.
Operator Overloading; String and Array Objects
Operator Overloading.
Operator Overloading; String and Array Objects
Overview of C++ Overloading
Operator overloading Dr. Bhargavi Goswami
Operator Overloading, Friends, and References
Operator Overloading.
Operator Overloading.
CISC/CMPE320 - Prof. McLeod
Operator Overloading Professor Hugh C. Lauer CS-2303, System Programming Concepts (Slides include materials from The C Programming Language, 2nd edition,
COP 3330 Object-oriented Programming in C++
Pointers and Pointer-Based Strings
Operator Overloading I
Operator Overloading; String and Array Objects
Class rational part2.
Jim Fawcett Copyright ©
Presentation transcript:

Operator Overloading CS 3370 – C++ Chapter 14

Operator Overloading More than just Syntactic Sugar Binary operators Unary operators Conversion Operators Proxy Classes (simulating a reference) bitset example Special operators Indexing Pre-post increment/decrement Function call

Complex Numbers A Canonical Example of a Value Type Complex numbers are pairs of real numbers (real, imaginary), e.g., (2,3), (1.04, -12.4) like points in the x-y plane (a, b) + (c, d) = (a+c, b+d) applications in Electrical Engineering Compare function-style operations to using operator functions…

A complex Class #include <iostream> class complex { double real; double imag; public: complex(double real=0, double imag=0) this->real = real; this->imag = imag; } complex add(const complex& c) const complex result; result.real = this->real + c.real; result.imag = this->imag + c.imag; return result; void display(std::ostream& os) const os << '(' << real << ',' << imag << ')'; };

Using the complex Class using namespace std; int main() { complex z(1,2), w(3,4); complex a = z.add(w); // want a = z+w a.display(cout); } (4,6)

Operator Functions operator keyword together with an operator token etc. Can overload all operators except: :: . .* ?:

complex with operator+ A member-function implementation class complex { // ... public: complex operator+(const complex& c) const complex result; result.real = this->real + c.real; result.imag = this->imag + c.imag; return result; } }; int main() complex z(1,2), w(3,4); complex a = z + w; // z.operator+(w) a.display(cout); Note the const - + returns a new temporary.

Rules operator+ is the function name Normal precedence rules apply you can also invoke it directly as z.operator+(w) a binary function, of course Normal precedence rules apply Can be either a global or member function If a member, this is the left operand If global, at least one argument must be user-defined Binary member operators take a single argument.

Conversion Constructors and Operator Overloading Single-arg constructors provide implicit conversions For example T::T(int) Can use 2 initialization syntaxes: T t(1); T t = 1; Provide implicit conversions t + 1 becomes t + T(1) Can disable with the explicit keyword

complex Conversion class complex { public: complex(double real = 0, double imag = 0) this->real = real; this->imag = imag; } // … }; int main() complex w(3,4); complex a = w + 1; // w + (1,0) a.display(cout); (4,4)

Member vs. Non-member Operators The expression 1 + w won’t compile. Left-operand must be a class object to match a member operator A non-member operator will apply an implicit conversion to either operand via a single-arg constructor, if available In general, binary operators should be non-members For math-like operators, anyway In general, unary operators should be members

Non-member complex Operators class complex { public: complex(double real = 0, double imag = 0) this->real = real; this->imag = imag; } double getReal() const {return real;} double getImag() const {return imag;} // ... }; complex operator+(const complex& c1, const complex& c2) double real = c1.getReal() + c2.getReal(); double imag = c1.getImag() + c2.getImag(); complex result(real, imag); return result;

A Unary complex Operator class complex { public: complex operator-() const return complex(-real, -imag); } // … }; int main() complex w(3,4); complex a = -w; a.display(cout); (-3,-4)

Stream Operators operator<< and operator>> Must be global because the left operand is a stream! Stream is passed by reference for efficiency it disallows copy anyway Should also return the stream to support chaining insertions and extractions

complex Stream Output ostream& operator<<(ostream& os, const complex& c) { os << '(' << c.getReal() << ',’ << c.getImag() << ')'; return os; } int main() complex w(3,4); complex a = -w; cout << a << endl; (-3,-4)

A “Complete” complex Would provide all pertinent operators including assignment ops such as +=, -=, etc. assignment ops must be members typically implement op in terms of op= Provide stream insertion and extraction Global functions are usually class friends remember the “Interface Principle”

Implementing op+ and op+= Typical implementation pattern Develop operator+= first it should return a reference to this Write operator+ in terms of operator+=: T operator+(T t1, const T& t2) { return t1 += t2; } (Note: t1 is passed by value)

operator[] A Unary Operator Usually should provide two versions: And takes an integer index argument, of course Must be a member For “array-like” things vectors, strings Usually should provide two versions: a version for const objects a version for non-const objects other operators may require this pattern

A “Safe” Array class Also a Useless class :-) class Index { enum {N = 100}; int data[N]; int size; public: Index(int n) if (n > N) throw "dimension error"; for (int i = 0; i < n; ++i) data[i] = i; size = n; } int getSize() const {return size;} int& operator[](int i) if (i < 0 || i >= size) throw "index error"; return data[i]; };

Using Index #include <iostream> using namespace std; int main() { Index a(10); for (int i = 0; i < a.getSize(); ++i) cout << a[i] << ' '; cout << endl; a[5] = 99; cout << a[5] << endl; cout << a[10] << endl; } 0 1 2 3 4 5 6 7 8 9 99 abnormal program termination

Using a const Index #include <iostream> using namespace std; int main() { const Index a(10); // a const Index for (int i = 0; i < a.getSize(); ++i) cout << a[i] << ' '; // COMPILE ERROR! cout << endl; }

Supporting a const Index That pesky Reference Return Problem again! class Index { // ... int& operator[](int i) if (i < 0 || i >= size) throw "index error"; return data[i]; } int operator[](int i) const // A const version };

operator[][] Doesn’t exist! Simulate it Just like multi-dimensional arrays don’t exist Simulate it Using the “array of arrays” paradigm a[i][j] == (a.operator[](i)).operator[](j) The outer operator[] should return something that has another operator[] to invoke Example: op2db.cpp

Conversion Operators The complement to single-arg constructors Provide implicit conversions to another type Member function with the signature: operator T() const;

Index-to-double Conversion class Index { // ... operator double() const double sum = data[0]; for (int i = 1; i < size; ++i) sum += data[i]; return sum / size; } }; int main() const Index a(10); double x = a + 1; cout << x << endl; 5.5

Warning! Consider the expression where w is complex. Design heuristic: Don’t allow types to be implicitly converted to each other You can disable implicit conversions via constructors and conversion operators via the explicit keyword

lvalue vs. rvalue Detection Idiom Used in Program 4 (see returnref lvalue vs. rvalue Detection Idiom Used in Program 4 (see returnref.cpp) For operator[ ] Because bits are not individually addressable Setting and resetting a bit are very different operations Uses a Proxy class Returned by bitset<N>::operator[] Stores the bit position and a reference to the bitset Overloads operator=(bool) Converts implicitly to bool Develop this live! Need diagram.

Review Program 4 Spec

Other Operators -> (for “smart pointers”) ++, -- ( ) we covered this already ++, -- Both pre and post versions ( ) “function-call” operator We’ll see more of this when we cover algorithms

Overloading ++ and -- Must distinguish between pre and post Post versions take an extraneous int argument The post versions must save current value That’s why the pre versions are more efficient They should also return a const object To disallow x++++ Illegal, modifies temporary Examples: PrePost.cpp, SafeArrayPtr.cpp

Overloading operator( ) The “Function Call” Operator Constitutes a Function Object An object that behaves like a function If class T::operator( ) exists: Then t( ) acts like a function call Example: findGreater.cpp, findGreater2.cpp

Operator Overloading Checkpoint When should you make an operator function a non- member? Why should you provide two versions of operator[]? What side effect ensues from defining a constructor that be can called with a single argument? When should you use a conversion operator? When shouldn't you use a conversion operator?