Oop Operator Overload
Oop Operator Overload
Lecture 10
Operator Overloading
Shiow-yang Wu
Department of Computer Science and
Information Engineering
National Dong Hwa University
Operators
Operators +, -, %, ==, etc.
Really just functions!
Operator Overloading 2
Note1
Operator Overloading
Built-in operators
e.g.: +, -, = , %, ==, /, *
Already work for C++ built-in types
In standard "binary" notation
Overloading Basics
Overloading operators
VERY similar to overloading functions
Operator itself is the name of function
Money
Operator Overloading 4
Note2
Operator Overloading
Operator Overloading 5
Operator Overloading
Operator Overloading 6
Note3
//increment c1
//increment c2
//increment c2
Operator Overloading 8
Note4
Operator Overloading 9
Operator Overloading 10
Note5
. . .
class Counter {
private:
unsigned int count;
public:
Counter() : count(0)
{ }
//count
//constructor
Operator Overloading 11
Operator Overloading 12
Note6
#include <iostream>
using namespace std;
class Counter
{
private:
unsigned int count;
public:
Counter() : count(0)
{ }
//count
//constructor
Operator Overloading 13
Operator Overloading 14
Note7
//c1=0, c2=0
//c1=1
//c1=2, c2=2
Operator Overloading 15
Operator Overloading 16
Note8
Postfix Notation
//count
//constructor
Operator Overloading 17
Postfix Notation
Counter(int c) : count(c)
//constructor
{ }
unsigned int get_count() const
{ return count; }
Counter operator ++ () //increment (prefix)
{ return Counter(++count); }
Counter operator ++ (int) //inc. (postfix)
{ return Counter(count++); }
};
// the (int) is NOT an argument but simply
// indicates a postfix operator
Object-Oriented Programming in C++
Operator Overloading 18
Note9
Postfix Notation
int main()
{
Counter c1, c2;
//c1=0, c2=0
//c1=1
//c1=2, c2=2 (prefix)
Postfix Notation
c2 = c1++;
Operator Overloading 20
Note10
Overloading Arithmetic
Operators
Operator Overloading 21
Overloading Arithmetic
Operators
public:
Distance() : feet(0), inches(0.0)
{ }
Distance(int ft, float in) :
feet(ft), inches(in)
{ }
void showdist() const {
cout << feet << "\'-"
<< inches << '\"';
}
//add 2 distances
Distance operator + ( Distance ) const;
};
Object-Oriented Programming in C++
Operator Overloading 22
Note11
Overloading Arithmetic
Operators
Distance Distance::operator + (Distance d2)
const //add Distance
{
int f = feet + d2.feet;
float i = inches + d2.inches;
if(i >= 12.0) {
i -= 12.0;
f++;
}
//return a temporary Distance
return Distance(f,i);
}
Operator Overloading 23
Overloading Arithmetic
Operators
int main()
{
Distance dist1(10, 6.5), dist2(11, 6.25);
Distance dist3, dist4;
dist3 = dist1 + dist2;
// '+' operator
dist4 = dist1 + dist2 + dist3;
cout << "dist1 = ";
. . .
cout << "dist4 = ";
cout << endl;
return 0;
dist1.showdist();
dist4.showdist();
}
Object-Oriented Programming in C++
Operator Overloading 24
Note12
Overloading Arithmetic
Operators
Operator Overloading 25
Overloading Arithmetic
Operators
Operator Overloading 26
Note13
Concatenating Strings
. . .
#include <string.h>
#include <stdlib.h>
class String { //user-defined string type
private:
static const int SZ = 80;
char str[SZ];
//holds a C-string
public:
String()
{ strcpy(str, ""); }
String( char s[] )
{ strcpy(str, s); }
Object-Oriented Programming in C++
Operator Overloading 27
Concatenating Strings
void display() const
{ cout << str; }
String operator + (String ss) const {
String temp; //make a temp String
if( strlen(str) + strlen(ss.str) < SZ ) {
strcpy(temp.str, str);
strcat(temp.str, ss.str);
} else {
cout << "\nString overflow";
exit(1);
}
return temp;
}
};
Object-Oriented Programming in C++
Operator Overloading 28
Note14
Overloading Comparison
Operators
class Distance
//English Distance class
{
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0)
{ }
Distance(int ft, float in) :
feet(ft), inches(in)
{ }
Operator Overloading 29
Overloading Comparison
Operators
void getdist() {
cout << "\nEnter feet: ";
cin >> feet;
cout << "Enter inches: ";
cin >> inches;
}
void showdist() const {
cout << feet << "\'-"
<< inches << '\"';
}
//operator to compare distances
bool operator < (Distance) const;
};
Object-Oriented Programming in C++
Operator Overloading 30
Note15
Overloading Comparison
Operators
bool Distance::operator < (Distance d2) const
//return true or false
{
float bf1 = feet + inches/12;
float bf2 = d2.feet + d2.inches/12;
return (bf1 < bf2) ? true : false;
}
int main()
{
Distance dist1;
dist1.getdist();
Operator Overloading 31
Overloading Comparison
Operators
Distance dist2(6, 2.5);
cout << "\ndist1 = ";
cout << "\ndist2 = ";
dist1.showdist();
dist2.showdist();
Operator Overloading 32
Note16
Comparing Strings
#include <string.h>
//for strcmp()
class String
//user-defined string type
{
private:
static const int SZ = 80;
char str[SZ];
//holds a C-string
public:
String()
{ strcpy(str, ""); }
String( char s[] )
{ strcpy(str, s); }
Object-Oriented Programming in C++
Operator Overloading 33
The == Operator
void display() const
{ cout << str; }
void getstr()
{ cin.get(str, SZ); }
//operator to check for equality
bool operator == (String ss) const
{
return ( strcmp(str, ss.str)==0 ) ?
true : false;
}
};
Object-Oriented Programming in C++
Operator Overloading 34
Note17
Arithmetic Assignment
Operators
class Distance { //English Distance class
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0)
{ }
Distance(int ft, float in) :
feet(ft), inches(in)
{ }
void showdist() const
{ cout << feet << "\'-"
<< inches << '\"'; }
Operator Overloading 35
Object-Oriented Programming in C++
Arithmetic Assignment
Operators
void operator += ( Distance );
};
//------ add distance to this one -------void Distance::operator += (Distance d2)
{
feet += d2.feet;
//add the feet
inches += d2.inches;
//add the inches
if(inches >= 12.0) {
inches -= 12.0;
feet++;
}
}
Object-Oriented Programming in C++
Operator Overloading 36
Note18
Operator Overloading 37
Operator Overloading 38
Note19
Operator Overloading 39
Operator Overloading 40
Note20
Operator Overloading 41
Operator Overloading 42
Note21
#include <iostream>
using namespace std;
#include <stdlib.h>
//for exit()
const int LIMIT = 100;
//array size
//////////////////////////////////////////
class safearay2
{
private:
int arr[LIMIT];
Object-Oriented Programming in C++
Operator Overloading 43
Operator Overloading 44
Note22
//left side
Operator Overloading 45
Operator Overloading 46
Note23
Overloaded [] Operator
#include <iostream>
using namespace std;
#include <stdlib.h>
//for exit()
const int LIMIT = 100;
//array size
//////////////////////////////////////////
class safearay
{
private:
int arr[LIMIT];
public:
int& operator [](int n) //return by reference
{
Object-Oriented Programming in C++
Operator Overloading 47
Overloaded [] Operator
if( n < 0 || n >= LIMIT ) {
cout << "\nIndex out of bounds";
exit(1);
}
return arr[n];
}
};
Operator Overloading 48
Note24
Overloaded [] Operator
int main()
{
safearay sa1;
for(int j=0; j<LIMIT; j++)
sa1[j] = j*10;
//*left* side
for(int j=0; j<LIMIT; j++) {
int temp = sa1[j];
//*right* side
cout << "Element " << j << " is "
<< temp << endl;
}
return 0;
}
Operator Overloading 49
Overloaded [] Operator
Operator Overloading 50
Note25
Data Conversion
Operator Overloading 51
Data Conversion
Operator Overloading 52
Note26
Operator Overloading 53
Operator Overloading 54
Note27
Operator Overloading 55
mtrs = dist2;
Must be a non-static member function w/o return type.
Operator Overloading 56
Note28
Operator Overloading 57
Operator Overloading 58
Note29
Operator Overloading 59
//no-arg constructor
//1-arg constructor
//C-string -> String
//display the String
//conversion operator
//String -> C-string
};
Operator Overloading 60
Note30
Operator Overloading 61
Operator Overloading 62
Note31
Conversions Between
Different Classes
Conversions Between
Different Classes
24-hour Time
12:00 a.m.
6:00 a.m.
12:00 p.m.
6:00 p.m.
11:59 p.m.
00:00:00
06:00:00
12:00:00
18:00:00
23:59:00
Operator Overloading 64
Note32
= pm, false = am
12
59, no seconds !!
hrs(0), mins(0)
Operator Overloading 65
Operator Overloading 66
Note33
Operator Overloading 67
Operator Overloading 68
Note34
Operator Overloading 69
Operator Overloading 70
Note35
//display
}
Object-Oriented Programming in C++
Operator Overloading 72
Note36
Operator Overloading 73
Operator Overloading 74
Note37
Operator Overloading 75
Operator Overloading 76
Note38
Operator Overloading 77
Operator Overloading 78
Note39
Operator Overloading 80
Note40
Other Overloads
Operator Overloading 81
Pitfalls of Op Overloading
and Conversion
Operator Overloading 82
Note41
Pitfalls of Op Overloading
and Conversion
Operator Overloading 83
Assignment 7
1.
Operator Overloading 84
Note42
Assignment 7
Design, implement, and test a complex number
class that represents the real and imaginary parts as
double precision values (data type double) and
provides at least the following operations:
Operator Overloading 85
Assignment 7
2.
Operator Overloading 86
Note43
Assignment 7
3.
Operator Overloading 87
Assignment 7
4.
Operator Overloading 88
Note44