1 / 52

Overloading Operators

8. Overloading Operators. Object-Oriented Programming Using C++ Second Edition. 8. Objectives. In this chapter, you will learn: About the benefits of overloading About the rules that apply to operator overloading How to overload math operators

Download Presentation

Overloading Operators

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 8 Objectives • 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

  3. 8 Objectives • 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

  4. 8 Understanding the Benefits of 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

  5. 8 Using the + Operator Polymorphically • 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

  6. 8 Overloading Operators—The 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

  7. 8 Overloading Operators—The 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. 8 Binary Operators that Can Be Overloaded

  9. 8 Overloading Operators—The 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

  10. 8 Overloading Operators—The Rules

  11. 8 Overloading 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+()

  12. 8 Overloading Math Operators

  13. 8 Overloading 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;

  14. 8 Overloading Math Operators

  15. 8 Paying Attention to the Order 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

  16. 8 Paying Attention to the Order 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

  17. 8 Output of SalesOffice2.cpp

  18. 8 Overloading an Operator to Work with a Class Object and 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

  19. 8 Overloading an Operator to Work with a Class Object and 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

  20. 8 Using Multiple Operations in 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

  21. 8 The Sale Class

  22. 8 Using Multiple Operations in 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

  23. 8 Program that Adds Three Sale Objects

  24. 8 Using Multiple Operations in 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

  25. 8 Using Multiple Operations in 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

  26. 8 Overloading 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

  27. 8 Overloading 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

  28. 8 Overloading Output • The operator <<() function is a friend to the ostream class

  29. 8 Overloading 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

  30. 8 Overloading 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);

  31. 8 Overloaded Operator>>() Function for the Sale Class

  32. 8 Overloading 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

  33. 8 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

  34. 8 Using the Prefix and Postfix ++ Operators with an Integer

  35. 8 The Inventory Class

  36. 8 Overloading ++ and - - • The statements numSold++;, numSold = numSold +1;, and numSold += 1; all would work

  37. 8 Using Postfix Increment and Decrement Operators • 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);

  38. 8 Overloading 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

  39. 8 Overloading 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

  40. 8 Overloading 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

  41. 8 The Movie Class

  42. 8 Program that Uses the Movie Class

  43. 8 Overloading the = Operator • Figure 8-21 shows a program that declares two Movie objects • This sample program uses unconventional blocking to illustrate the potential error situation • You can avoid the preceding problem by overloading the = operator so the two Movie title pointers don’t point to the same memory

  44. 8 Overloading the = Operator

  45. 8 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

  46. 8 The Book Class

  47. 8 Overloading [ ] and ( )

  48. 8 Using the Parentheses Operator • 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

  49. 8 Using the Parentheses Operator

  50. 8 Summary • 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

More Related