50
Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Embed Size (px)

Citation preview

Page 1: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Chapter 15: Operator Overloading

C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Page 2: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Objectives

In this chapter, you will:

• Learn about overloading

• Become aware of the restrictions on operator overloading

• Examine the pointer this

• Learn about friend functions

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 2

Page 3: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Objectives (cont'd.)

• Explore the members and nonmembers of a class

• Discover how to overload various operators

• Learn about templates

• Explore how to construct function templates and class templates

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 3

Page 4: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Why Operator Overloading Is Needed

• Consider the following statements:

• Which of the following would you prefer?

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 4

Page 5: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Why Operator Overloading is Needed (cont'd.)

• Operator overloading: extend definition of an operator to work with a user-defined data type

• The only built-in operations on classes are assignment and member selection

• Other operators cannot be applied directly to class objects

• C++ allows you to extend the definitions of most of the operators to work with classes

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 5

Page 6: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Operator Overloading

• Can overload most C++ operators• Cannot create new operators• Most existing operators can be overloaded

to manipulate class objects• Write an operator function to overload an

operator– Use reserved word operator

– Example: write a function called: operator>=

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 6

Page 7: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Syntax for Operator Functions

• The syntax of an operator function heading:

– The operator function is value-returning– operator is a reserved word

• To overload an operator for a class:– Include operator function in the class definition– Write the definition of the operator function

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 7

Page 8: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading an Operator: Some Restrictions

• Cannot change precedence or associativity• Default arguments cannot be used• Cannot change number of arguments• Cannot create new operators• Cannot overload: . .* :: ?: sizeof• How operator works with built-in types remains

the same– Can overload for user-defined objects or for a

combination of user-defined and built-in objects

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 8

Page 9: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Pointer this

• Every object of a class maintains a (hidden) pointer to itself called this

• When an object invokes a member function– this is referenced by the member function

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 9

Page 10: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Friend Functions of Classes

• Friend function (of a class): nonmember function of the class that has access to all the members of the class

• To make a function friend to a class– Reserved word friend precedes the

function prototype in the class definition

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 10

Page 11: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Definition of a friend Function

• "friend" doesn’t appear in function definition

• When writing the friend function definition– The name of the class and the scope

resolution operator are not used

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 11

Page 12: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Operator Functions as Member Functions and Nonmember Functions

• To overload (), [], ->, or = for a class, function must be a member of the class

• If op is overloaded for opOverClass:– If the leftmost operand of op is an object of a

different type, the overloading function must be a nonmember (friend) of the class

– If the overloading function for op is a member of opOverClass, then when applying op on objects of type opOverClass, the leftmost operand must be of type opOverClass

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 12

Page 13: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 13

Operator Functions as Member Functions and Nonmember

Functions (cont’d.)

Page 14: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 14

Operator Functions as Member Functions and Nonmember

Functions (cont’d.)

Page 15: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading Binary Operators

• If # represents a binary operator (e.g., + or ==) that is to be overloaded for rectangleType– Operator can be overloaded as either a

member function of the class or as a friend function

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 15

Page 16: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Binary Operators as Member Functions

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 16

Page 17: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Binary Operators (Arithmetic or Relational) as

Nonmember Functions

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 17

Page 18: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Stream Insertion (<<) and Extraction (>>)

Operators• Consider the expression:

cout << myRectangle;

• The leftmost operand of << is an ostream object, not an object of type rectangleType– Thus, the operator function that overloads <<

for rectangleType must be a nonmember function of the class

• The same applies to the function that overloads >>

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 18

Page 19: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Stream Insertion Operator (<<)

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 19

Page 20: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Stream Extraction Operator (>>)

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 20

Page 21: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Assignment Operator (=)

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 21

Page 22: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading Unary Operators

• To overload a unary operator for a class: – If the operator function is a member of the

class, it has no parameters– If the operator function is a nonmember (i.e., it

is a friend function), it has one parameter

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 22

Page 23: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Increment (++) and Decrement (--) Operators

• General syntax to overload the pre-increment operator ++ as a member function:

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 23

Page 24: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Increment (++) and Decrement (--) Operators

(cont'd.)• General syntax to overload the pre-

increment operator ++ as a nonmember function:

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 24

Page 25: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Increment (++) and Decrement (--) Operators (cont'd.)

• General syntax to overload the post-increment operator ++ as a member function:

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 25

Page 26: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Increment (++) and Decrement (--) Operators (cont'd.)

• Syntax to overload the post-increment operator ++ as a nonmember function:

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 26

Page 27: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Operator Overloading: Member versus Nonmember

• Certain operators must be overloaded as member functions and some must be overloaded as nonmember (friend) functions

• The binary arithmetic operator + can be overloaded either way

• Overload + as a member function– Operator + has direct access to data members of

one of the objects

– Need to pass only one object as a parameter

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 27

Page 28: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Operator Overloading: Member versus Nonmember (cont'd.)

• Overload + as a nonmember function– Must pass both objects as parameters– Could require additional memory and time to

make a local copy of the data

• For efficiency purposes, overload operators as member functions

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 28

Page 29: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Classes and Pointer Member Variables (Revisited)

• Classes with pointer member variables must:– Explicitly overload the assignment operator– Include the copy constructor– Include the destructor

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 29

Page 30: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Operator Overloading: One Final Word

• Suppose that an operator op is overloaded for a class—say, rectangleType– Whenever we use op on objects of type rectangleType, the body of the function that overloads the operator op for the class rectangleType executes

– Therefore, whatever code you put in the body of the function executes

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 30

Page 31: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Programming Example: Complex Numbers

• Complex number: number of the form a + ib, in which i2 = -1 and a and b are real numbers

• Addition and multiplication of complex numbers are defined by the following rules:– (a + ib) + (c + id) = (a + c) + i(b + d )– (a + ib) * (c + id) = (ac - bd) + i(ad + bc)

• C++ has no built-in data type that allows us to manipulate complex numbers– Construct a data type, complexType, that can

be used to process complex numbers

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 31

Page 32: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Programming Example: Complex Numbers (cont’d.)

• Overload– Stream insertion– Stream extraction– +– *

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 32

Page 33: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 33

Programming Example: Complex Numbers (cont’d.)

Page 34: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 34

Programming Example: Complex Numbers (cont’d.)

Page 35: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Programming Example: Complex Numbers (cont’d.)

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 35

Page 36: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Programming Example: Complex Numbers (cont’d.)

• Output a complex number in the form: (a, b)– Output the left parenthesis, (

– Output the real part– Output the comma and a space– Output the imaginary part– Output the right parenthesis, )

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 36

Page 37: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Programming Example: Complex Numbers (cont’d.)

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 37

Page 38: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Programming Example: Complex Numbers (cont’d.)

• The input is of the form: (3, 5)

• Read this complex number:– Read and discard the left parenthesis– Read and store the real part– Read and discard the comma– Read and store the imaginary part– Read and discard the right parenthesis

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 38

Page 39: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Programming Example: Complex Numbers (cont’d.)

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 39

Page 40: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Overloading the Array Index (Subscript) Operator ([])

• Syntax to declare operator[] as a member of a class for nonconstant arrays:

• Syntax to declare operator[] as a member of a class for constant arrays:

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 40

Page 41: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Function Overloading

• Overloading a function: several functions with the same name, but different parameters– Parameter types determine which function will

execute– Must provide the definition of each function

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 41

Page 42: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Templates

• Templates: a single code body for a set of related functions (called function template) and related classes (called class template)

• Syntax:

where Type is the type of the data and declaration is either a function declaration or a class declaration

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 42

Page 43: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Templates (cont'd.)

• The word class in the heading refers to any user-defined type or built-in type

• Type is called a formal parameter to the template

• Just as variables are parameters to functions– Data types are parameters to templates

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 43

Page 44: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Function Templates

• The syntax of the function template is:

where Type is called a formal parameter of the template

• Type – Specifies type of parameters to the function

– Specifies return type of the function

– Declares variables within the function

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 44

Page 45: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Class Templates

• Class templates: a single code segment represents a set of related classes – Called parameterized types

• Syntax:

• A template instantiation can be created with either a built-in or user-defined type

• The function members of a class template are considered function templates

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 45

Page 46: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Header File and Implementation File of a Class Template

• Passing a parameter to a function takes effect at run time

• Passing a parameter to a class template takes effect at compile time

• Cannot compile the implementation file independently of the client code– Can put class definition and definitions of the

function templates directly in the client code– Can put class definition and the definitions of

the function templates in the same header file

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 46

Page 47: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Header File and Implementation File of a Class Template (cont'd.)

• Another alternative: put class definition and function definitions in separate files– However, include directive to implementation

file at the end of header file

• In either case, function definitions and client code are compiled together

• We will put the class definition and the function definitions in the same header file

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 47

Page 48: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Summary

• An operator that has different meanings with different data types is said to be overloaded

• Any function that overloads an operator is called an operator function

• operator is a reserved word• Operator functions are value-returning• Operator overloading provides the same

concise notation for user-defined data types as for built-in data types

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 48

Page 49: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Summary (cont'd.)

• Only existing operators can be overloaded

• The pointer this refers to the object

• A friend function is a nonmember of a class

• If an operator function is a member of a class– The leftmost operand of the operator must be

a class object (or a reference to a class object) of that operator’s class

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 49

Page 50: Chapter 15: Operator Overloading C++ Programming: From Problem Analysis to Program Design, Fifth Edition

Summary (cont'd.)

• Every instance of an overloaded function has different sets of parameters

• Templates:– Function template: a single code segment for

a set of related functions– Class template: a single code segment for a

set of related classes• Called parameterized types

C++ Programming: From Problem Analysis to Program Design, Fifth Edition 50