operator overloading week 4-5 chapter 19. class money {private:int lira; int kurus; public: money()...

33
OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19

Upload: albert-rich

Post on 18-Jan-2016

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

OPERATOR OVERLOADING

WEEK 4-5 CHAPTER 19

Page 2: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

class Money{ private: int lira; int kurus;

public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100; }

Money toplam(const Money & x) { int l, k;

l=x.lira+lira; k =x.kurus+ kurus;Money neww( l, k);return neww; }

void print_Money(){ cout<<lira << “TL" <<kurus<< " KURUS“<< endl;} };

void main(){ Money m1(3, 550); Money m2(19, 600);

Money x= m1.toplam(m2); /*Money m3 = m1 + m2 SYNTAX ERROR!! */

x.print_Money(); /* cout << x; SYNTAX ERROR!!*/ }

Page 3: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Function Overloading && Operator Overloading

• C++ supports function overloading; so we can use the same name for two or more functions in the same program

• C++ language supports operator overloading as well. By overloading an operator,

– We can define our own meaning to the operator whenever we use that operator together with an object of our own defined type.

Page 4: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Operator Overloading

• Operators that can be overloaded:

– arithmetic operators: +, -, *, /, %, ++, --, etc.– relational operators: <, <=, ==, !=, >, >=, etc. – assignment operator: = ; +=,*=,/=,%=, etc.– logical operators: &&, ||, !,|, ~, &,^, etc.– input/output operators: <<, >>

• Operators that can not be overloaded !!!!!!!!!!!!!!

– Member selector : .– Member object selector : .*– Scope resolution : ::– Conditional : ?:

Page 5: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Operator Overloading : Three ways

1.Member function ( Class method )

2.Nonmember (Top level-Global) function

3.Friend Function

Page 6: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

1. Operator overloading with Member functions ( a method of the class)

• Declare methods in the class with names– operator+()– operator-()– operator<()– operator>()– operator!()– …

• For binary operations (operations which require two operands) you need only one input parameter ( like +,-,%,<,>,= )

Money m1,m2;m1+m2;

• For unary operations you need no parameters ( like !, -(negation), &(address of))

Money m1,m2;!m1; &m2; -m1;

Page 7: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

class Money{ private: int lira; int kurus;

public: Money(){}; Money(int l, int k) { lira=l+k/100; kurus=k%100; }

Money operator+ (const Money & x) // MEMBER FUNCTION

{ int l, k; l=x.lira-lira;

k =x.kurus+ kurus; Money neww( l, k);

return neww; }

void print_Money(){cout<<lira << “YTL" <<kurus<< " KURUS“<< endl;};

void main(){ Money m1(3, 550); Money m2(19, 600);

Money x = m1 + m2; //m1.operator+(m2);x.print_Money(); }

EXAMPLE: Member Function

Operator + Overloaded

Page 8: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Operator Overloading with Member Functions “+” and “–”

Money Money:: operator+ (const Money & x) // A MEMBER FUNCTION { int l, ks;

l=x.lira+lira; k=x.kurus+ kurus;Money neww( l, k );return neww; }

Money Money::operator- (const Money & x) // A MEMBER FUNCTION{ int l, k;

l=-x.lira+lira; k=-x.kurus+ kurus;Money neww ( l, k );return neww; }

void main(){ Money m1(3, 550);

Money m2(19, 600);

Money x = m1 + m2; Money y= m1 - m2; //m1.operator-(m2)//cout << x; // SYNTAX ERROR!! Operator << is not defined for Moneyx.print_Money(); }

Page 9: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Operator Overloading with Member Functions Binary and Unary “–”

Money Money ::operator- (const Money & x) // BINARY OPERATOR NEEDS TWO OPERANDS{ int l, k;

l=lira-x.lira; k=kurus- x.kurus;Money neww( l, k);return neww; }

Money Money ::operator- () // UNARY OPERATOR NEEDS ONLY ONE OPERAND // WILL GET THE NEGATIVE : x -x{ int l, k;

l=-lira; k=- kurus;Money neww( l, k);return neww; }

void main(){ Money m1(3, 550);

Money m2(19, 600);Money x = m1 - m2; //m1.operator-(m2);Money y= -m1; //m1.operator-();x.print_Money();y.print_Money(); }

Page 10: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Operator Overloading with Member Functions : Relational operator ==

// Money m1(…), m2(….);// if(m1==m2) {…..}// else {…..}

bool Money:: operator> (const Money & x){ int total_this, total_x;

total_x=x.lira*100+x.kurus; total_this=lira*100+kurus;

if(total_this>total_x) return 1;else return 0; }

Page 11: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Operator Precedence

• Operator precedence and syntax can not be changed through overloading !!!

EXAMPLE: Money m1, m2, m3, ans;ans=m1+m2* m3;// is similar with ans=m1+(m2*m3);

Page 12: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

2. Operator Overloading with Toplevel (Nonmember-Global) Functions

• Use functions to overload operators

• Declare functions like– operator+() //Money operator+(Money&x, Money&y);– operator-() – operator<()– operator!() //Money operator!(Money&x);– …

• For unary operators function must have one input parameter !x

• For binary operators function must have two input parameter x+y

• If top level functions tries to access private members , they have to call public methods that return private members ( get methods..)

Page 13: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

2. Operator Overloading with Toplevel (Global) Functions

class Money{ private: int lira, kurus;

public: Money(){};Money(int l, int k) { lira=l+k/100; kurus=k%100; }int get_lira() { return lira;} /* toplevel functions cannot access

private members so we have to define methods to return private members */

int get_kurus(){ return kurus;} };

Money operator+ (Money & x, Money &y){ int new_lira=x.get_lira()+y.get_lira();

int new_kurus =x.get_kurus()+ y.get_kurus();Money neww( new_lira, new_kurus);return neww; }

Money operator- (Money & x) // UNARY MINUS-NEGATION{ int new_lira=-x.get_lira(); int new_kurus =-x.get_kurus();

static Money neww( new_lira, new_kurus);return neww; }

void main(){ Money m1(3, 550), m2(19, 600);

Money x = m1 + m2; Money y= -m1; }

Page 14: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

3. Operator Overloading with Friend Functions

• A class’s private members are accessible only to1. its methods 2. its friend functions!!!

Page 15: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

3. Operator Overloading with Friend Functionsclass Money{ private: int lira, kurus;

public: Money(){};Money(int l, int k) { lira=l+k/100; kurus=k%100; }void print_Money(){ cout<<lira << " " <<endl;}

friend Money operator+(const Money & , const Money &);friend Money operator-(const Money & ); };

Money operator+ (const Money & x, const Money &y){ int l=x.lira+y.lira;

int k=x.kurus+ y.kurus;static Money neww( l, k);return neww; }

Money operator- (const Money & x) // UNARY MINUS-NEGATION{ int l=-x.lira; int k =-x.kurus;

static Money neww( l, k);return neww; }

void main(){ Money m1(3, 550), m2(19, 600);

Money x = m1 + m2; Money y= -m1;x.print_Money(); y.print_Money(); }

Page 16: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Some Important Remarks• For all 3 ways for operator overloading , they are all called in the

same way!!Money m1, m2,m3;m3=m1+m2;

• Remember that parameters to the operators are POSITIONALthe order of the 1st/ and 2nd parameter does matter

Money operator- (Money & x){ int l,k;

l=lira-x.lira; k=kurus- x.kurus;//l=x.lira-lira; k=x.kurus- kurusMoney neww( l, k);return neww; }

Money m1, m2,m3;m3=m1-m2; // m1.operator-(m2);

Page 17: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

OVERLOADING THE INPUT AND OUTPUT OPERATORSint i; Money y;

cin>>i; cin>>y;

are interpreted as operator>>(cin,i);operator>>(cin,y);

– Operand >> belongs to a system class (e.g istream)– cin is a istream object

– If the leftmost operand must be an object of a different class or a fundamental data type , this operator must be implemented as non-member function or friend function

Page 18: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

OVERLOADING THE INPUT AND OUTPUT OPERATORS

– To overload >> to read a two integers for Money class (lira and kurus) we can write a top level function

istream& operator>>(istream & in,Money &m){ in>>m.lira>>m.kurus;

return in; }

Use this function as

Money m1;cin>>m1; // is equivalent to operator >>(cin, m1)

– If you want to use a method to overload >> you have to modify the system class so make it top-level function or friend function!!

Page 19: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

#include<iostream>using namespace std;

class Money{ friend istream& operator>>(istream &,Money &);

private: int lira; int kurus;

public: Money(int l, int k) { lira=l+k/100; kurus=k%100; }void print_Money(){ cout<<lira << " " <<kurus<<endl;} };

istream& operator>>(istream &in,Money &m){ in>>m.lira;

in>>m.kurus;return in; }

void main(){ Money m2(0, 0);

cin>>m2;//cout << x; // SYNTAX ERROR!! Operator << is not defined for Moneym2.print_Money(); }

EXAMPLE:

Operator >> overloaded

Page 20: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

OVERLOADING THE INPUT AND OUTPUT OPERATORS

– To overload << to print out a two integers for Money class (lira and kurus) we can write a top level function

ostream& operator<<(ostream & out,Money &m){

out<<m.lira<<“TL”<<m.kurus<<“KURUS”<<endl; return out; }

Use this function as

Money m1;cout<<m1; // is equivalent to operator <<(cout, m1)

– If you want to use a method to overload << you have to modify the system class so make it top-level function or friend function!!

Page 21: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

#include<iostream>#include<iomanip>using namespace std;

class Money{ friend istream& operator>>(istream &,Money &);

friend ostream& operator<<(ostream &,Money &);

private: int lira; int kurus;public: Money(int l, int k) { lira=l+k/100; kurus=k%100; } };

istream& operator>>(istream &in,Money &m){ in>>m.lira>>m.kurus;

return in; }

ostream& operator<<(ostream &out,Money &m){ out<<m.lira<<" YTL "<<m.kurus<<" KURUS"<<endl;

return out; }

void main(){ Money m2(0, 0);

cin>>m2;cout<<m2; }

EXAMPLE:

Operator << overloaded

Page 22: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Overloading Assignment Operator =

• Compiler provides default copy constructor and assignment operator if the author does not provide his own

class Money {.... };void main(){

Money m1(10, 1000);Money m2(100, 1000);m1=m2;

}

Page 23: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Overloading Assignment Operator =class Money{ private: int lira; int kurus;

public:Money(int l, int k) { lira=l+k/100; kurus=k%100; }Money & operator=(const Money & x) // will return a reference to m1

{ if(this->lira>=x.lira) { lira=x.lira; kurus=x.kurus; }return *this; } };

main() { Money m1(100, 200), m2(30,430); m1=m2; // this is m1 and x is m2

cout<<m1; // << has been overloaded in previous slides }

Page 24: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

OVERLOADING THE [] SUBSCRIPT OPERATOR?

#include <iostream>#include<string>using namespace std;void main () { int i;

int b[5];

for (i=0; i<sizeof (b) / sizeof (b[0]); i++) // i=0 to 4 b[i]=2*i;

for (i=0; i<8; i++) cout<<b[i]<<'\n'; }

OUTPUT: 02468512451204332409Press any key to continue

0 2 4 6 8 5

b[0].............b[4] i

Page 25: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

class myArray{

private : int size;int *a; // a= address of the first element in

arraypublic:

myArray(int s); ~myArray();int & operator[] (int i); // a[i]int get_size() const{ return size; }

};

EXAMPLE:Overloading Subscript operator []

Page 26: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

int & myArray::operator[] (int i) { if (i <0 || i>=size)

{ cerr<<“Error: Subscript ”<<i<<“\n Out of Bounds”; exit(0); }return a[i]; }

myArray::myArray(int s) { a= new int [s]; size=s;}

myArray::~myArray() { delete [] a; }

void main () { int i;

myArray b(5);for (i=0; i<b.get_size(); i++) b[i]=2*i; for (i=0; i<8; i++) cout<<b[i]<<'\n'; }

// IMPORTANT NOTE: Subscript operator [] must be overloaded as a method !!

EXAMPLE:Overloading Subscript operator []

OUTPUT:

0

2

4

6

8

Error: Subscript 5

Out of Bounds

Page 27: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

Overloading Function call operator ()• Overloaded function-call operator does not modify how functions are called;

rather, it modifies how the operator is to be interpreted when applied to objects of a given class type

• Function call operator must be overloaded as a method !!

EXAMPLE: class Point{ public: Point() { _x = _y = 1; }

Point(int x, int y) { _x=x; _y=y;}

Point &operator()( int dx, int dy ) { _x += dx; _y += dy; return *this; }

friend ostream & operator << (ostream & out, Point & p) { out<<"x = "<<p._x<<" y= "<<p._y<<endl; return out; }

private: int _x, _y;};

void main(){ Point pt;

pt( 3, 2 ); cout <<pt;Point pt2(3,2); cout<<pt2;pt2(1,1);cout<<pt2; }

OUTPUT:

x = 4 y= 3

x = 3 y= 2

x = 4 y= 3

Press any key to continue

Page 28: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

Overloading Increment and Decrement operators

• The increment ++ and decrement - - operators come in a prefix and a postfix flavor

int x = 6;++x // prefix ++x++ // postfix ++

• We can overload the prefix ++, the postfix ++, the prefix - -, and the postfix - -.

Page 29: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

Overloading Increment and Decrement operators

• The declaration operator++() refers to the prefix operator ++x

• The declaration operator++( int ) refers to the postfix operator x++

• If the prefix increment operator has been overloaded, the expression ++obj is equivalent to obj.operator++()

• If the postfix increment has been overloaded, the expression obj++ is equivalent to obj.operator++(0)

Page 30: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

EXAMPLE: Overloading Increment

• A Clock class will be implemented.

• If c is a Clock object, c++ advances the time one minute. The value of the expression c++ is the original Clock

• Executing ++c also advances the time one minute, but the value of the expression ++c is the updated Clock.

Page 31: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

/* Clock.h*/class Clock { public :

friend ostream & operator <<(ostream &out, Clock &p) { out<<setfill('0')<<setw(2)<<p.hour<<":" ;

out<<setw(2)<<p.min<<endl; return out; }

Clock ( int =12, int =0);Clock tick();Clock operator++(); //++cClock operator++(int); // c++

private:int hour; int min; };

EXAMPLE : OVERLOADING INCREMENT OPERATOR

Page 32: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

#include “Clock.h”Clock::Clock ( int h, int m)

{ hour=h; min=m;}

Clock Clock::tick() { ++min;

if (min>=60) { hour= hour+min/60; min= min%60;}return *this; }

Clock Clock::operator ++() {return tick ();} //PREFIX

Clock Clock::operator ++(int n) //POSTFIX{ Clock c=*this;

tick(); // this will be incrementedreturn c; // previous value of this will be returned

}

EXAMPLE : OVERLOADING INCREMENT OPERATOR

Page 33: OPERATOR OVERLOADING WEEK 4-5 CHAPTER 19. class Money {private:int lira; int kurus; public: Money() {}; Money(int l, int k) { lira=l+ k/100; kurus=k%100;

Senem Kumova Metin

void main(){ Clock c( 12, 50); Clock d;cout <<"Clock c: "<<c;cout <<"Clock d: "<<d;d= c++;cout<<"Clock c: "<<c;cout<<"Clock d: "<<d;cout<<"........"<<endl;

cout <<"Clock c: "<<c;cout <<"Clock d: "<<d;d= ++c;cout<<"Clock c: "<<c;cout<<"Clock d: "<<d; }

EXAMPLE : OVERLOADING INCREMENT OPERATOR