# Chapter 8 Operator Overloading, Friends, and References Copyright

Chapter 8 Operator Overloading, Friends, and References Copyright 2016 Pearson, Inc. All rights reserved. Learning Objectives Basic Operator Overloading Unary operators As member functions Friends and Automatic Type Conversion Friend functions, friend classes

Constructors for automatic type conversion References and More Overloading << and >> Operators: = , [], ++, -- Copyright 2016 Pearson Inc. All rights reserved. 8-2 Operator Overloading Introduction Operators +, -, %, ==, etc. Really just functions! Simply "called" with different syntax:

x+7 "+" is binary operator with x & 7 as operands We "like" this notation as humans Think of it as: +(x, 7) "+" is the function name x, 7 are the arguments Function "+" returns "sum" of its arguments Copyright 2016 Pearson Inc. All rights reserved. 8-3 Operator Overloading Perspective

Built-in operators e.g., +, -, = , %, ==, /, * Already work for C++ built-in types In standard "binary" notation We can overload them! To work with OUR types! To add "Chair types", or "Money types" As appropriate for our needs In "notation" were comfortable with Always overload with similar "actions"! Copyright 2016 Pearson Inc. All rights reserved. 8-4

Overloading Basics Overloading operators VERY similar to overloading functions Operator itself is "name" of function Example Declaration: const Money operator +( const Money& amount1, const Money& amount2); Overloads + for operands of type Money Uses constant reference parameters for efficiency Returned value is type Money Allows addition of "Money" objects

Copyright 2016 Pearson Inc. All rights reserved. 8-5 Overloaded "+" Given previous example: Note: overloaded "+" NOT member function Definition is "more involved" than simple "add" Requires issues of money type addition Must handle negative/positive values Operator overload definitions generally very simple Just perform "addition" particular to "your" type

Copyright 2016 Pearson Inc. All rights reserved. 8-6 Money "+" Definition: Display 8.1 Operator Overloading Definition of "+" operator for Money class: Copyright 2016 Pearson Inc. All rights reserved. 8-7 Overloaded "==" Equality operator, == Enables comparison of Money objects

Declaration: bool operator ==(const Money& amount1, const Money& amount2); Returns bool type for true/false equality Again, its a non-member function (like "+" overload) Copyright 2016 Pearson Inc. All rights reserved. 8-8 Overloaded "==" for Money: Display 8.1 Operator Overloading Definition of "==" operator for Money class:

Copyright 2016 Pearson Inc. All rights reserved. 8-9 Constructors Returning Objects Constructor a "void" function? We "think" that way, but no A "special" function With special properties CAN return a value! Recall return statement in "+" overload for Money type: return Money(finalDollars, finalCents);

Returns an "invocation" of Money class! So constructor actually "returns" an object! Called an "anonymous object" Copyright 2016 Pearson Inc. All rights reserved. 8-10 Returning by const Value Consider "+" operator overload again: const Money operator +(const Money& amount1, const Money& amount2); Returns a "constant object"? Why?

Consider impact of returning "non-const" object to see Copyright 2016 Pearson Inc. All rights reserved. 8-11 Returning by non-const Value Consider "no const" in declaration: Money operator +(const Money& amount1, const Money& amount2); Consider expression that calls: m1 + m2 Where m1 & m2 are Money objects

Object returned is Money object We can "do things" with objects! Like call member functions Copyright 2016 Pearson Inc. All rights reserved. 8-12 What to do with Non-const Object Can call member functions: We could invoke member functions on object returned by expression m1+m2: (m1+m2).output(); //Legal, right? Not a problem: doesnt change anything

(m1+m2).input(); //Legal! PROBLEM! //Legal, but MODIFIES! Allows modification of "anonymous" object! Cant allow that here! So we define the return object as const Copyright 2016 Pearson Inc. All rights reserved. 8-13 Overloading Unary Operators

C++ has unary operators: Defined as taking one operand e.g., - (negation) x = -y; // Sets x equal to negative of y Other unary operators: ++, -- Unary operators can also be overloaded Copyright 2016 Pearson Inc. All rights reserved. 8-14 Overload "-" for Money

Overloaded "-" function declaration Placed outside class definition: const Money operator (const Money& amount); Notice: only one argument Since only 1 operand (unary) "-" operator is overloaded twice! For two operands/arguments (binary) For one operand/argument (unary) Definitions must exist for both Copyright 2016 Pearson Inc. All rights reserved. 8-15

Overloaded "-" Definition Overloaded "-" function definition: const Money operator (const Money& amount) { return Money(-amount.getDollars(), -amount.getCents()); } Applies "-" unary operator to built-in type Operation is "known" for built-in types Returns anonymous object again Copyright 2016 Pearson Inc. All rights reserved.

8-16 Overloaded "-" Usage Consider: Money amount1(10), amount2(6), amount3; amount3 = amount1 amount2; Calls binary "-" overload amount3.output(); //Displays \$4.00 amount3 = -amount1; Calls unary "-" overload amount3.output() //Displays -\$10.00

Copyright 2016 Pearson Inc. All rights reserved. 8-17 Overloading as Member Functions Previous examples: standalone functions Defined outside a class Can overload as "member operator" Considered "member function" like others When operator is member function: Only ONE parameter, not two! Calling object serves as 1st parameter

Copyright 2016 Pearson Inc. All rights reserved. 8-18 Member Operator in Action Money cost(1, 50), tax(0, 15), total; total = cost + tax; If "+" overloaded as member operator: Variable/object cost is calling object Object tax is single argument Think of as: total = cost.+(tax); Declaration of "+" in class definition:

const Money operator +(const Money& amount); Notice only ONE argument Copyright 2016 Pearson Inc. All rights reserved. 8-19 const Functions When to make function const? Constant functions not allowed to alter class member data Constant objects can ONLY call constant member functions Good style dictates:

Any member function that will NOT modify data should be made const Use keyword const after function declaration and heading Copyright 2016 Pearson Inc. All rights reserved. 8-20 Overloading Operators: Which Method? Object-Oriented-Programming Principles suggest member operators Many agree, to maintain "spirit" of OOP

Member operators more efficient No need to call accessor & mutator functions At least one significant disadvantage (Later in chapter) Copyright 2016 Pearson Inc. All rights reserved. 8-21 Overloading Function Application () Function call operator, ( ) Must be overloaded as member function Allows use of class object like a function Can overload for all possible numbers

of arguments Example: Aclass anObject; anObject(42); If ( ) overloaded calls overload Copyright 2016 Pearson Inc. All rights reserved. 8-22 Other Overloads &&, ||, and comma operator Predefined versions work for bool types Recall: use "short-circuit evaluation"

When overloaded no longer uses short-circuit Uses "complete evaluation" instead Contrary to expectations Generally should not overload these operators Copyright 2016 Pearson Inc. All rights reserved. 8-23 Friend Functions Nonmember functions Recall: operator overloads as nonmembers They access data through accessor and mutator

functions Very inefficient (overhead of calls) Friends can directly access private class data No overhead, more efficient So: best to make nonmember operator overloads friends! Copyright 2016 Pearson Inc. All rights reserved. 8-24 Friend Functions Friend function of a class Not a member function

Has direct access to private members Just as member functions do Use keyword friend in front of function declaration Specified IN class definition But theyre NOT member functions! Copyright 2016 Pearson Inc. All rights reserved. 8-25 Friend Function Uses Operator Overloads Most common use of friends

Improves efficiency Avoids need to call accessor/mutator member functions Operator must have access anyway Might as well give full access as friend Friends can be any function Copyright 2016 Pearson Inc. All rights reserved. 8-26 Friend Function Purity Friends not pure? "Spirit" of OOP dictates all operators and functions be member functions

Many believe friends violate basic OOP principles Advantageous? For operators: very! Allows automatic type conversion Still encapsulates: friend is in class definition Improves efficiency Copyright 2016 Pearson Inc. All rights reserved.

8-27 Friend Classes Entire classes can be friends Similar to function being friend to class Example: class F is friend of class C All class F member functions are friends of C NOT reciprocated Friendship granted, not taken Syntax: friend class F Goes inside class definition of "authorizing" class Copyright 2016 Pearson Inc. All rights reserved.

8-28 References Reference defined: Name of a storage location Similar to "pointer" Example of stand alone reference: int robert; int& bob = robert; bob is reference to storage location for robert Changes made to bob will affect robert Confusing?

Copyright 2016 Pearson Inc. All rights reserved. 8-29 References Usage Seemingly dangerous Useful in several cases: Call-by-reference Often used to implement this mechanism Returning a reference Allows operator overload implementations to be written more naturally Think of as returning an "alias" to a variable

Copyright 2016 Pearson Inc. All rights reserved. 8-30 Returning Reference Syntax: double& sampleFunction(double& variable); double& and double are different Must match in function declaration and heading Returned item must "have" a reference Like a variable of that type Cannot be expression like "x+5" Has no place in memory to "refer to"

Copyright 2016 Pearson Inc. All rights reserved. 8-31 Returning Reference in Definition Example function definition: double& sampleFunction(double& variable) { return variable; } Trivial, useless example Shows concept only Major use: Certain overloaded operators

Copyright 2016 Pearson Inc. All rights reserved. 8-32 Overloading >> and << Enables input and output of our objects Similar to other operator overloads New subtleties Improves readability Like all operator overloads do Enables: cout << myObject; cin >> myObject; Instead of need for:

myObject.output(); Copyright 2016 Pearson Inc. All rights reserved. 8-33 Overloading >> Insertion operator, << Used with cout A binary operator Example: cout << "Hello"; Operator is << 1st operand is predefined object cout

From library iostream 2nd operand is literal string "Hello" Copyright 2016 Pearson Inc. All rights reserved. 8-34 Overloading >> Operands of >> Cout object, of class type ostream Our class type Recall Money class Used member function output()

Nicer if we can use >> operator: Money amount(100); cout << "I have " << amount << endl; instead of: cout << "I have "; amount.output() Copyright 2016 Pearson Inc. All rights reserved. 8-35 Overloaded >> Return Value Money amount(100); cout << amount; << should return some value To allow cascades:

cout << "I have " << amount; (cout << "I have ") << amount; Two are equivalent What to return? cout object! Returns its first argument type, ostream Copyright 2016 Pearson Inc. All rights reserved. 8-36 Overloaded >> Example: Display 8.5 Overloading << and >> (1 of 5)

Copyright 2016 Pearson Inc. All rights reserved. 8-37 Overloaded >> Example: Display 8.5 Overloading << and >> (2 of 5) Copyright 2016 Pearson Inc. All rights reserved. 8-38 Overloaded >> Example: Display 8.5 Overloading << and >> (3 of 5) Copyright 2016 Pearson Inc. All rights reserved.

8-39 Overloaded >> Example: Display 8.5 Overloading << and >> (4 of 5) Copyright 2016 Pearson Inc. All rights reserved. 8-40 Overloaded >> Example: Display 8.5 Overloading << and >> (5 of 5) Copyright 2016 Pearson Inc. All rights reserved.

8-41 Assignment Operator, = Must be overloaded as member operator Automatically overloaded Default assignment operator: Member-wise copy Member variables from one object corresponding member variables from other Default OK for simple classes But with pointers must write our own! Copyright 2016 Pearson Inc. All rights reserved.

8-42 Increment and Decrement Each operator has two versions Prefix notation: ++x; Postfix notation: x++; Must distinguish in overload Standard overload method Prefix Add 2d parameter of type int Postfix Just a marker for compiler! Specifies postfix is allowed Copyright 2016 Pearson Inc. All rights reserved.

8-43 Overload Array Operator, [ ] Can overload [ ] for your class To be used with objects of your class Operator must return a reference! Operator [ ] must be a member function! Copyright 2016 Pearson Inc. All rights reserved. 8-44 Summary 1 C++ built-in operators can be overloaded To work with objects of your class

Operators are really just functions Friend functions have direct private member access Operators can be overloaded as member functions 1st operand is calling object Copyright 2016 Pearson Inc. All rights reserved. 8-45 Summary 2 Friend functions add efficiency only Not required if sufficient accessors/mutators

available Reference "names" a variable with an alias Can overload <<, >> Return type is a reference to stream type Copyright 2016 Pearson Inc. All rights reserved. 8-46

## Recently Viewed Presentations

• 3-4 mils of Epoxy primer. 5-6 mils of FEVE-based clear coating. Coating remained intact. Recent Discoveries in FEVE Technology . Moisture Permeability Testing. Following ASTM Test Method E96 or D1653. ... Unit of measurement is grams of water vapor per...
• Quins són els aspectes fonamentals del procés d'ensenyament i d'aprenentatge que un model de disseny instruccional basat en l'ús de les TIC i els LO hauria de tenir en compte? Quin model de disseny instruccional ens permetrà dissenyar a partir...
• Natural or man made. An event that disrupts the functioning of a community . Causes human, material, economic, environmental losses . Overwhelming demand on resources . Examples of recent disasters natural or man made San Bernardino and Paris Shootings,
• Changes in the Terms of Trade and the Productivity Performance of Canada and the Netherlands by W. Erwin Diewert, Department of Economics, University of British Columbia Presented at the Workshop on Index Number Theory Tinbergen Institute at the University of...
• We compared our EA with self-adaptive semi-autonomous parent selection to a regular EA on three test problems: counting ones, 4-bit deceptive trap, and SAT. ... Arial MS Pゴシック Times Times New Roman Blank Presentation Microsoft Office Excel Chart MathType 5.0...
• Tecumseh sought to build pan-Indian alliance against whites. 1810 - Tecumseh called for attacks on American settlements. 1811 - Battle of Tippecanoe - General William Henry Harrison destroyed Tecumseh's home base. Tecumseh later killed in battle w/American forces during War...
• Arial Garamond Times New Roman Wingdings Monotype Corsiva Default Design Microsoft Excel Worksheet Microsoft Excel Chart SmartDraw Drawing A Depth-First-Search Controlled Gridless Incremental Routing Algorithm for VLSI Circuits Outline Introduction Incremental Routing Slide 5 Prior work on Incremental Routing Emmert-Bhatia...
• Properties of Acids. Acids are proton (hydrogen ion, H+) donors. Acids have a pH lower than 7. Acids taste sour. Acids effect indicators. Blue litmus turns red. Methyl orange turns red. Acids react with active metals, producing H. 2 Acids...