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 it’s 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" we’re 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, it’s 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: doesn’t change anything
• (m1+m2).input(); //Legal!
– PROBLEM! //Legal, but MODIFIES!
• Allows modification of "anonymous" object!
• Can’t 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 they’re 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