chapter 7 operator overloading and type conversions

Post on 12-Jan-2016

57 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Chapter 7 Operator Overloading and Type Conversions. §7.1 Defining Operator Overloading §7.2 Overloading Unary Operators §7.3 Overloading Binary Operators §7.4 Overloading Other Operators §7.5 Type Conversions. §7.1 Introduction. Operators (运算符) How about object variables? - PowerPoint PPT Presentation

TRANSCRIPT

Chapter 7Operator Overloading and Type Conversions

§7.1 Defining Operator Overloading

§7.2 Overloading Unary Operators

§7.3 Overloading Binary Operators

§7.4 Overloading Other Operators

§7.5 Type Conversions

§7.1 Introduction

Operators (运算符)

How about object variables? String operators

+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= <<

>> >>= <<= == != <= >= && || ++ --

->* , -> [] () new delete

2

string s1 = "ABC";string s2 = s1 + "DEF";cout<<s1<<endl;cout<<(s1>s2)<<endl;...

string s1 = "ABC";string s2 = s1 + "DEF";cout<<s1<<endl;cout<<(s1>s2)<<endl;...

int a = 1;int b = a+1;if(a<b) cout<<a;

int a = 1;int b = a+1;if(a<b) cout<<a;

class C{};C c, a, b;c = a + b;//?

class C{};C c, a, b;c = a + b;//?

The Rational Class (分数) Rational

-numerator: long

-denominator: long

+Rational()

+Rational(numerator: long, denominator: long)

+getNumerator(): long

+getDenominator(): long

+add(secondRational: Rational &): Rational

+subtract(secondRational: Rational &): Rational

+multiply(secondRational: Rational &): Rational

+divide(secondRational: Rational &): Rational +compareTo(secondRational: Rational &): int

+equals(secondRational: Rational &): bool

+intValue(): int

+doubleValue(): double

+toString(): string

-gcd(n: long, d: long): long

3

1/2, 1/3, 11/12,…1/2, 1/3, 11/12,…

3 4 23 83 4 23 8

4 7 32 9…4 7 32 9…

bbaa

Rational.cppRational.cpp

RunRun

Rational.hRational.h

TestRationalClass.cppTestRationalClass.cpp

分子分母

Operation of the Rational Class

4

Rational Rational::add(Rational &secondRational) {long n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator();long d = denominator * secondRational.getDenominator();return Rational(n, d);

}Rational Rational::subtract(Rational &secondRational){

long n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator();long d = denominator * secondRational.getDenominator();return Rational(n, d);

}…

Rational Rational::add(Rational &secondRational) {long n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator();long d = denominator * secondRational.getDenominator();return Rational(n, d);

}Rational Rational::subtract(Rational &secondRational){

long n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator();long d = denominator * secondRational.getDenominator();return Rational(n, d);

}…

cout<<r1.toString()<< " + "<< r2.toString()<< " = "<< r1.add(r2).toString()<< endl; cout<<r1.toString()<< " - "<< r2.toString()<< " = "<< r1.subtract(r2).toString()<< endl; …

cout<<r1.toString()<< " + "<< r2.toString()<< " = "<< r1.add(r2).toString()<< endl; cout<<r1.toString()<< " - "<< r2.toString()<< " = "<< r1.subtract(r2).toString()<< endl; …

cout << r1<< " + " << r2 << " = "<< r1+r2<< endl; cout << r1<< " - " << r2 << " = "<<r1-r2<< endl; …

cout << r1<< " + " << r2 << " = "<< r1+r2<< endl; cout << r1<< " - " << r2 << " = "<<r1-r2<< endl; …

Operator Functions (运算符函数) The functions to overload operators

5

bool Rational::operator< (Rational &secondRational){ if (this->compareTo(secondRational) < 0) return true; else return false;}

if(r1 < r2) cout<<“r1 is less than r2.”<<endl;if(r1 < r2) cout<<“r1 is less than r2.”<<endl;

if(r1.operator<(r2)) cout<<“r1 is less than r2.”<<endl;if(r1.operator<(r2)) cout<<“r1 is less than r2.”<<endl;

Defining Operator Overloading

General form

Can also be friends:

6

type classname :: operator op(arglis){ Function body // task defined}

vector operator+ (vector); // vector additionvector operator- (); // unary minusfriend vector operator+ (vector, vector);//vector additionfriend vector operator- (vector); // unary minus

§7.2 Overloading Unary Operators

‘+’ and ‘-’ --no parameters

7

Overloading Unary MinusOverloading Unary Minus

void space :: operator-(){ x=-x; y=-y; z=-z;}

//declarationfriend void operator-(space &s);//definition void operator-(space &s) { s.x=-s.x; s.y=-s.y; s.z=-s.z;}

Overloading ++ and --

Prefix vs. Postfix

8

++r1

r1++

Rational Rational::operator++() { numerator += denominator; return *this;

}

Rational Rational::operator++(){ Rational temp(numerator, denominator); numerator += denominator; return temp;

}

(int dummy){

Same signature,How to distinguish them?

哑元参数 ,the value is never used;It must be “int”.

Same signature,How to distinguish them?

Overloading “[]”

The array subscript [] is an operator Can be overloaded to access the members of an

object

9

long Rational::operator[](const int &index){ if (index == 0) return numerator; else if (index == 1) return denominator; else{ cout << "subscript error" << endl; exit(0); }

}

int main(){ Rational r(2,3); cout << r[0]/r[1];

}

[] Accessor and Mutator The [] operator functions as both accessor and

mutator. After adding this operator to the Rational class,

the Rational class is mutable.

10

Rational r4(1, 2); r4[0] = 3; r4[1] = 4;

Rational

-numerator: long

-denominator: long

+Rational()

+Rational(numerator: long, denominator: long)

+getNumerator(): long

+getDenominator(): long

+add(secondRational: Rational &): Rational

+subtract(secondRational: Rational &): Rational

+multiply(secondRational: Rational &): Rational

+divide(secondRational: Rational &): Rational +compareTo(secondRational: Rational &): int

+equals(secondRational: Rational &): bool

+intValue(): int

+doubleValue(): double

+toString(): string

-gcd(n: long, d: long): long

long &Rational::operator[](const int &index)

§7.3 Overloading Binary Operators

11

Overloading + operatorOverloading + operator

//functional notationC = sum ( A, B);

//arithmetic notationC = A + B;

complex complex :: operator+(complex c){ complex temp; temp.x = x + c.x; temp.y = y + c.y; return(temp); }

Operands of Binary Operators

Features: Only one complex argument Returns a complex type value A member function of complex

12

complex complex :: operator+(complex c){ complex temp; temp.x = x + c.x; temp.y = y + c.y; return(temp); } C3 = C1 + C2;

C3 = C1.operator+(C2);

Operands of Binary Operators

13

complex complex :: operator+(complex c){ complex temp;

temp.x = c.x + x; temp.y = c.y + y;

return(temp);}

4.10

6.20

temp

4.10 x

6.20 y

C3

2.50 x

3.50 y

C1

1.60 x

2.70 y

C2;+=

Fig.7.1 ⇔ Implementation of the overload + operator

Notes

The left operand is fixed to be the operating object automatically

c1 = c2 + c3 ; c1 = c2.operator+(c3);

The number of parameters is determined by the operator itself You cannot change it

Overloading does not change the operator precedence (优先级) and associativity (结合性)

The (return) type of the operator function can be defined by you Usually the same class type to be operational in complex

operation

14

§7.4 Overloading Other Operators

15

+=, -=, *=, /=

Rational Rational::operator +=(Rational &secondRational){ *this = this->add(secondRational); return (*this);}

Rational r1(2, 4);Rational r2 = r1 += Rational(2, 3);cout << "r1 is " << r1.toString() << endl;cout << "r2 is " << r2.toString() << endl;

Overloading “=”

By default, “=” performs a memberwise copy For Rational class, it is OK.

How about others?

16

Rational r1(1, 2);

Rational r2(4, 5);

r1 = r2; class Person{private: int id; Date* birthDate; };…p1 = p2;

Overloading “=”

“The rule of three” Copy constructor Destructor “=”

17

person1: Person

id = 111

birthDate

111

Memory : BirthDate

year = 1963 month = 5 day = 3 reference

person2: Person

id = 111

birthDate

111

Memory

reference

Overloading “=”

18

const Person Person::operator=(const Person &p){id = p.id;Date *p=p.getBirthDate();birthDate = new Date(*p);return *this;

}

Friend: the left-hand operand as an argument

19

Friend vs. Member

C3 = C1 + C2 C3 = C1.operator+(C2)

C3 = C1 + 2 C3 = C1.operator+(2)

C3 = 2 + C1 C3 = 2.operator+(C1) ???

C3 = 2 + C1 C3 = operator+(2, C1)

friend complex operator+(complex a, complex b);complex operator+(complex a, complex b) { return complex((a.x+b.x),(a.y+b.y)); }

Two versions p = 2 * m;//equivalent to p = operator*(2,m)

q = n * 2;//equivalent to q = operator*(n,2) By overloading >> and << using functions:

friend istream& operator>>(istream&, vector&);

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

vector variables in input and output statements can be used like simple variables

20

Overloading >> and <<

Overloading as friends.cppOverloading as friends.cpp

Manipulation of Strings To define operators to manipulate the strings For example:

string3 = string1 + string2; if( string1 >= string2 ) string = string1;

An example program overloads + and <=

21Mathematical operations on stringsMathematical operations on strings

// overloading + operatorString operator+(const String &s, const String &t){ String temp; temp.len = s.len + t.len; temp.p = new char[temp.len+1]; strcpy(temp.p,s.p); strcat(temp.p,t.p); return temp;}

// overloading <= operatorint operator<=(const String &s, const String &t){

int m = strlen(s.p);int n = strlen(t.p);if(m <= n) return(1);else return(0);

}

Overloadable Operators

22

+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= <<

>> >>= <<= == != <= >= && || ++ --

->* , -> [] () new delete

Unoverloadable Operators:

:: . .* ? : # sizeof

Unoverloadable Operators:

:: . .* ? : # sizeof

A friend cannot be used:

= ( ) [ ] ->

A friend cannot be used:

= ( ) [ ] ->

§7.5 Type Conversions

Automatic type conversion for built-in types Constants and variables of different types are mixed in

an expression Right type of an assignment operator “=“ to the left

For example,int m;

float x = 3.14159;

m = x; What happens when they are user-defined data

types?

Using Casting operator or Constructor

23

Three types of situations

A. Conversion from basic type to class type

B. Conversion from class type to basic type

C. Conversion from one class type to another class type

24

Basic to Class Type

Implemented by using constructors with single argument

25

string::string (char * a){ length = strlen(a); p = new char[length+1]; strcpy(p, a);}

string s1,s2;char* name1 = “IBM PC”;char* name2 = “Apple”;s1 = string(name1);s2 = name2;

Class to Basic Type

By defining an overloaded casting operator Usually referred to as a conversion function:

26

operator typename(){ ...... ......(Function statements)}

Rational::operator double(){ return numerator/denominator;}

int main(){ Rational r(2,3); double d = r;}

string:: operator char*(){ return (p);}

Notes on class basic type

1. It must be a class member

2. It must not specify a return type

3. It must not have any arguments

27

One Class to Another Class Type By either a constructor or a conversion function

28

objx = objy // Y is a source class

Casting operator function

Data access functions

Constructor function

Class X

Argument of type Y

Class Y

Conversion here (destination class)

Conversion here (source class)

Class Y

Converted value of type X

Fig.7.2 ⇔ Conversion between object

An Example of Class to Class

A data conversion example From invent1 to invent2

29

Data conversionsData conversions

//constructor for conversion//invent2(invent1 p){ code = p.getcode(); value =p.getitems() * p.getprice();

}

//operator function for conversionoperator invent2(){ invent2 temp; temp.code = code; temp.value = price * items; return temp; }

Summary of all the three conversions

30

Conversion requiredConversion takes place in

Source class Destination class

Basic → Class Not applicable Constructor

Class → Basic Casting operator Not applicable

Class → Class Casting operator Constructor

Summary

Operator functions to overload operators Overloading as member or friend Overloading unary, binary operators

Operands? Overloading other operators Type conversion

31

Review Questons

Q7.3 Q7.7 Q7.8

32

top related