1 overloading operators object-oriented programming using c++ second edition 8
TRANSCRIPT
11
Overloading OperatorsOverloading Operators
Object-Oriented Programming Object-Oriented Programming Using C++Using C++
Second EditionSecond 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
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
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
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
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
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
88
Binary Operators that Can Binary Operators that Can Be OverloadedBe Overloaded
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
1010
Overloading Operators—Overloading Operators—The RulesThe Rules
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
1212
Overloading Math OperatorsOverloading Math Operators8
Ex8-1
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
1414
Overloading Math OperatorsOverloading Math Operators8
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
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
1717
Output of SalesOffice2.cppOutput of SalesOffice2.cpp8
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
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
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
2121
The Sale ClassThe Sale Class8
Ex8-4
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
2323
Program that Adds Three Program that Adds Three Sale ObjectsSale Objects
8
Ex8-4
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
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
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
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
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
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
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
3131
Overloaded Operator>>() Overloaded Operator>>() Function for the Sale ClassFunction for the Sale Class
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
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
3434
Using the Prefix and Postfix ++ Operators Using the Prefix and Postfix ++ Operators with an Integerwith an Integer
8
3535
The Inventory ClassThe Inventory Class8
3636
Overloading ++ and - -Overloading ++ and - -
• The statements numSold++;, numSold = numSold +1;, and numSold += 1; all would work
8
Ex8-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
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
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
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
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
4242
The Book ClassThe Book Class8
Ex8-10
4343
Overloading [ ] and ( )Overloading [ ] and ( )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
4545
Using the Parentheses Using the Parentheses OperatorOperator
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
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
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