48
1 Overloading Operators Overloading Operators Object-Oriented Object-Oriented Programming Using C++ Programming Using C++ Second Edition Second Edition 8

1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

Embed Size (px)

Citation preview

Page 1: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

11

Overloading OperatorsOverloading Operators

Object-Oriented Programming Object-Oriented Programming Using C++Using C++

Second EditionSecond Edition

8

Page 2: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

22

ObjectivesObjectives

• In this chapter, you will learn:

• About the benefits of overloading

• About the rules that apply to operator overloading

• How to overload math operators

• How to overload operators to work with a class object and a primitive object

• How to chain multiple mathematical operations in a statement

8

Page 3: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

33

ObjectivesObjectives

• In this chapter, you will learn:• How to overload the insertion (<<) operator for

output• How to overload the extraction operator (>>) for

input• How to overload the prefix and postfix ++ and --

operators• How to overload the = = operator• How to overload the = operator• How to overload the subscript and parentheses

operators

8

Page 4: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

44

Understanding the Benefits Understanding the Benefits of Overloadingof Overloading

• Having more than one function with the same name is beneficial because you can use one easy-to-understand function name without paying attention to the data types involved

• Polymorphism allows the same operation to be carried out differently, depending on the object

• Purists find a subtle difference between overloading and polymorphism

• Some reserve the term polymorphism (or pure polymorphism) for situations in which one function body is used with a variety of arguments

8

Page 5: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

55

Using the + Operator Using the + Operator PolymorphicallyPolymorphically

• Separate actions can result from what seems to be the same operation or command

• The + operator has a variety of meanings, which include:

– Alone before a value (called unary form), + indicates a positive values, as in the expression +7

– Between two integers (called binary form), + indicates integer addition, as in the expression 5+ 9

– Between two floating-point numbers (also called binary form), + indicates floating-point addition, as in the expression 6.4 + 2.1

8

Page 6: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

66

Overloading Operators—Overloading Operators—The RulesThe Rules

• Operator overloading is the process by which you apply operators to your own abstract data types

• The +, -, *, and / symbols make it easy to work with built-in data types such as int and double

• Classes, however, contain a variety of data members• As a result, if you want the compiler to perform

arithmetic with two class objects, you must tell the compiler what you mean

• Good programming style dictates that you endow the operator with a reasonable meaning

8

Page 7: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

77

Overloading Operators—Overloading Operators—The RulesThe Rules

• You overload an operator by making it a function; subsequently, you can use it just like any other function

• C++ operators are classified as unary or binary, depending on whether they take one or two arguments, respectively

8

Page 8: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

88

Binary Operators that Can Binary Operators that Can Be OverloadedBe Overloaded

8

Page 9: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

99

Overloading Operators—Overloading Operators—The RulesThe Rules

• Associativity refers to the order in which actions within an expression are carried out

• You cannot change associativity when you overload operators

• You also cannot change the normal precedence of any operator

8

Page 10: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1010

Overloading Operators—Overloading Operators—The RulesThe Rules

8

Page 11: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1111

Overloading Math OperatorsOverloading Math Operators

• When you code an expression such as 4 + 7, C++ understands that you intend to carry out binary integer addition because of the context of the + symbol

• When you code an expression such as regularSal + bonus, if C++ can recognize regularSal and bonus as declared double variables, then floating-point addition takes place

• The name of the operator function that overloads the + symbol is operator+()

8

Page 12: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1212

Overloading Math OperatorsOverloading Math Operators8

Ex8-1

Page 13: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1313

Overloading Math OperatorsOverloading Math Operators

• The operator+() function in Figure 8-1 can work like any other member function

• When you examine the code for the addTwo() and operator+() functions in Figure 8-1, you see that the only difference is the function name

• Instead of the awkward sum = clerk.operator+(driver);, the operator+() function allows you to leave off the word operator in the function name and add either of the following statements:sum = clerk + driver;

sum = driver + clerk;

8

Page 14: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1414

Overloading Math OperatorsOverloading Math Operators8

Page 15: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1515

Paying Attention to the Paying Attention to the Order of the OperandsOrder of the Operands

• You can choose to overload any of the arithmetic operators for any classes you develop

• Then you can use the corresponding operator symbol in a natural way with class objects

8

Page 16: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1616

Paying Attention to the Paying Attention to the Order of the OperandsOrder of the Operands

• In the steps outlined on pages 270 to 282 of the textbook, you create a class for a SalesOffice

• The class will include an overloaded division operator (operator /) so you can divide one office’s sales by another to determine the ratio of their sales

8 Ex8-2

Page 17: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1717

Output of SalesOffice2.cppOutput of SalesOffice2.cpp8

Page 18: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1818

Overloading an Operator to Overloading an Operator to Work with a Class Object Work with a Class Object

and a Primitive Typeand a Primitive Type• When you add two objects using the + operator, the

objects do not have to be the same type

• You can add an integer and a double with an expression such as 5 + 7.84

8Ex8-3

Page 19: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

1919

Overloading an Operator to Overloading an Operator to Work with a Class Object Work with a Class Object

and a Primitive Typeand a Primitive Type• You cannot overload operators that work with

C++’s built-in data types

• You cannot overload the + that works with two doubles to make it do anything but add two doubles

• Similarly, you can’t overload operators whose first operand is an object that is a built-in type, even if the second operand is a class object

8

Page 20: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2020

Using Multiple Operations Using Multiple Operations in a Statementin a Statement

• Most modern programming languages allow several operators to be used in the same statement

• If you want to sum three values in an older programming language such as assembler or RPG, you first must add two values, producing a temporary total

• Then, in a separate statement, you add the third value to that total

8

Page 21: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2121

The Sale ClassThe Sale Class8

Ex8-4

Page 22: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2222

Using Multiple Operations Using Multiple Operations in a Statementin a Statement

• Because the associativity of addition occurs from left to right, the attempt to execute the addition highlighted in Figure 8-9 follows this sequence:1. The left-most + operator is encountered, and C++

recognizes a Sale on each side of the + symbol. The overloaded operator+() function is called, and saleAmounts for a Shirt and a Tie are added. A double is returned

2. The next + operator is encountered. A Sale object is found as the operand to the right of the +, but a double value is used as the operand to the left

8

Page 23: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2323

Program that Adds Three Program that Adds Three Sale ObjectsSale Objects

8

Ex8-4

Page 24: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2424

Using Multiple Operations Using Multiple Operations in a Statementin a Statement

• When the Sale class operator+() function does not return a double, but instead returns an object of Sale type (as shown in Figure 8-8), the multiple addition works correctly

• The sequence of events now occurs as follows:

1. The left-most + operator is encountered, and C++ recognizes a Sale object on each side of the + symbol. The overloaded operator+() function is called, and saleAmounts for a Shirt and a Tie are added

2. The next + operator is encountered. A Sale object now is found on each side of the +—the temporary object returned by the first addition, and the pants object

3. The temporary object is assigned to the total Sale object

8

Page 25: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2525

Using Multiple Operations Using Multiple Operations in a Statementin a Statement

• The results of the execution of the program in Figure 8-9 are shown in Figure 8-10

• C++ forces you to use the built-in precedence rules for your class operators

• If you want to be able to add either a double or a Sale object to a Sale object, then simply write both versions of the overloaded operator for the class

8

Page 26: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2626

Overloading OutputOverloading Output

• The << operator also is overloaded by C++• It is both a bitwise left-shift operator and an output

operator; it is called the insertion operator when used for output

• The << operator acts as an output operator only when cout (or another output stream object) appears on the left side

• When you use cout in a program, you must include #include<iostream.h>

• The preceding function, called operator<<(), returns a reference to ostream

8

Page 27: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2727

Overloading OutputOverloading Output

• It accepts two arguments: a reference to ostream (locally named out in this example) and an integer (locally named n in this example)

• C++ overloads the << operator to work with the built-in data types; you also may overload the << operator to work with your own classes

• To overload << operator so it can work with a Sale object, you must add the overloaded operator <<() function to the Sale class

8

Page 28: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2828

Overloading OutputOverloading Output

• The operator <<() function is a friend to the class of the object it wants to print out, e.g. Sale here.

8

Page 29: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

2929

Overloading OutputOverloading Output

• In the steps on page 288 of the textbook, you overload the insertion operator to work with the SalesOffice class you created earlier in this chapter

8Ex8-5

Page 30: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3030

Overloading InputOverloading Input

• If the << operator can be overloaded for output, it makes sense that the >> operator also can be overloaded for input

• The advantage of overloading operators such as >> is that the resulting programs look cleaner and are easier to read

• You can create an extraction operator, or operator>>() function, that uses istream (which is defined in iostream.h, along with ostream) by using a prototype as follows:friend istream& operator>>(istream &in, Sale &Sale);

8

Page 31: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3131

Overloaded Operator>>() Overloaded Operator>>() Function for the Sale ClassFunction for the Sale Class

8

Page 32: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3232

Overloading InputOverloading Input

• You could improve the operator>>() function shown in Figure 8-13 by adding code that verifies valid receipt numbers and sale amounts

• In the steps referred to on pages 289 and 290 of the textbook, you add an overloaded operator>>() function for the SalesOffice class

8

Ex8-6

Page 33: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3333

Overloading ++ and - -Overloading ++ and - -

• With C++, you use ++ to increment variables, and - - to decrement variables

• When a prefix operator such as ++ is used in an expression, the mathematical operation takes place before the expression is evaluated

• When the postfix operator is used, the expression is evaluated before the mathematical operation takes place

• Within the operator ++() function in the Inventory class, you can write the statement that increases numSold in several different ways

8

Page 34: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3434

Using the Prefix and Postfix ++ Operators Using the Prefix and Postfix ++ Operators with an Integerwith an Integer

8

Page 35: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3535

The Inventory ClassThe Inventory Class8

Page 36: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3636

Overloading ++ and - -Overloading ++ and - -

• The statements numSold++;, numSold = numSold +1;, and numSold += 1; all would work

8

Ex8-8

Page 37: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3737

Using Postfix Increment and Decrement Using Postfix Increment and Decrement OperatorsOperators

• A problem arises if you want to use a postfix ++ operator as well as a prefix ++ operator with a class

• When you overload any C++ function, you must supply different argument lists; for the postfix ++ operator, you use an integer argument

• The Inventory class postfix operator ++() function prototype is: Inventory& operator++(int);

8

Ex8-8

Page 38: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3838

Overloading the = = OperatorOverloading the = = Operator

• Writing an operator = =() function should be an easy task

• You simply decide what will constitute equality in class members

• When you create your own classes, you choose whether equivalency means that every data field must be equivalent, or only specific data members

• The operator = =() function may return either an integer or a boolean variable representing true or false

8

Page 39: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

3939

Overloading the = = OperatorOverloading the = = Operator

• A variable of type bool can hold one of two values: true or false

• Some older C++ compilers do not support the bool type; with those compilers you would use the first version of operator = =() that returns an integer

8

EX8-9

Page 40: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4040

Overloading the = OperatorOverloading the = Operator

• The = operator can be overloaded for use with your own classes

• Unlike other operators, if you don’t define the = operator, C++ provides a definition for you

• If you want the = operator to do something other than assign each member, then you must create a customer operator=()function

• In addition, if the class contains data fields that are pointers, you should create a custom function

8

EX8-9

Page 41: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4141

Overloading [ ] and ( )Overloading [ ] and ( )

• The subscript operator, operator[ ], is declared like any other function, but called in a manner similar to accessing an array element

• You can include any instructions you want within an operator [ ] function

• Typically, you use this function to perform a task that both requires an argument and does not quite fit into another operator’s usual meaning

• Consider a Book class such as the one shown in Figure 8-25

8

Page 42: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4242

The Book ClassThe Book Class8

Ex8-10

Page 43: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4343

Overloading [ ] and ( )Overloading [ ] and ( )8

Page 44: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4444

Using the Parentheses Using the Parentheses OperatorOperator

• You can use the parentheses operator to make multiple assignments within a class

• To overload the parentheses operator to assign both an author and a price to a member of the Book class, you can create the function

8

Page 45: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4545

Using the Parentheses Using the Parentheses OperatorOperator

8

Page 46: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4646

SummarySummary

• The built-in + operator is polymorphic in C++; it can take one or two arguments and have a different meaning in each case

• Operator overloading is the process by which you apply operators to your own abstract data types

• The name of the operator function that overloads the + symbol is operator+()

• The syntax involved in using the + operator alone is simpler, more natural, and easier to remember than using an ordinary member function

8

Page 47: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4747

SummarySummary

• You can overload the + operator to add two class objects, or a class object and a primitive object

• To enable you to chain mathematical operations, you overload the operator functions to return a class object

• The << operator is overloaded by C++; it is both a bitwise left-shift operator and an output operator

• The >> operator can be overloaded for input

• When you overload the prefix and postfix ++ and - - operators to work with your classes, the same prefix/postfix rules apply as they do with simple built-in types

8

Page 48: 1 Overloading Operators Object-Oriented Programming Using C++ Second Edition 8

4848

SummarySummary

• You overload the operator ==() function to return either an integer of a boolean variable representing true or false

• If you do not define the = operator, C++ provides a definition for you

• You overload the subscript and parentheses operators to handle situations where no other operator is appropriate, or when the appropriate operator already is in use

8