0% found this document useful (0 votes)
3 views46 pages

Lec 04 C

Chapter 8 covers operator overloading in C++, focusing on unary and binary operators, friend functions, and references. It explains how operators can be overloaded to work with user-defined types, such as a Money class, and discusses the efficiency of friend functions in accessing private data. Additionally, it addresses the importance of const correctness and the distinction between member and non-member functions in operator overloading.

Uploaded by

mohammedalnemari
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views46 pages

Lec 04 C

Chapter 8 covers operator overloading in C++, focusing on unary and binary operators, friend functions, and references. It explains how operators can be overloaded to work with user-defined types, such as a Money class, and discusses the efficiency of friend functions in accessing private data. Additionally, it addresses the importance of const correctness and the distinction between member and non-member functions in operator overloading.

Uploaded by

mohammedalnemari
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 46

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

You might also like