Chapter 5:
Overloading and Templates
Objectives
• In this chapter, you will
– Learn about overloading
– Become aware of the restrictions on operator overloading
– Examine the pointer this
– Learn about friend functions
C++ Programming: Program Design Including Data Structures, Sixth Edition 2
Objectives (cont’d.)
• In this chapter, you will (cont’d.)
– Explore the members and nonmembers of a class
– Overload various operators
– Learn about templates
– Construct function templates and class templates
C++ Programming: Program Design Including Data Structures, Sixth Edition 3
Introduction
• Templates: enable you to write generic code for
related functions and classes
• Function templates: used to simplify function
overloading
C++ Programming: Program Design Including Data Structures, Sixth Edition 4
Why Operator Overloading Is
Needed
• Consider the following statements:
• Which of the following would you prefer?
C++ Programming: Program Design Including Data Structures, Sixth Edition 5
Why Operator Overloading Is
Needed (cont’d.)
• Assignment and member selection are the only built-
in operations on classes
• Other operators cannot be applied directly to class objects
• Operator overloading: extends definition of an
operator to work with a user-defined data type
• C++ allows you to extend the definitions of most of the
operators to work with classes
C++ Programming: Program Design Including Data Structures, Sixth Edition 6
Operator Overloading
• Most existing C++ operators can be overloaded to
manipulate class objects
• Cannot create new operators
• Operator function: overloads an operator
– Use reserved word operator as the function name
C++ Programming: Program Design Including Data Structures, Sixth Edition 7
Syntax for Operator Functions
• Syntax of an operator function heading:
– It is a value-returning function
– operator is a reserved word
• To overload an operator for a class:
– Include operator function declaration in the class
definition
– Write the definition of the operator function
C++ Programming: Program Design Including Data Structures, Sixth Edition 8
Overloading an Operator: Some
Restrictions
• Cannot change precedence or associativity
• Default parameters cannot be used
• Cannot change number of parameters
• Cannot create new operators
• Cannot overload: . .* :: ?: sizeof
• How the operator works with built-in types remains
the same
– Can overload for user-defined objects or for a combination
of user-defined and built-in objects
C++ Programming: Program Design Including Data Structures, Sixth Edition 9
Pointer this
• Every object of a class maintains a (hidden) pointer
to itself called this
• When an object invokes a member function
– this is referenced by the member function
C++ Programming: Program Design Including Data Structures, Sixth Edition 10
Friend Functions of Classes
• Friend function (of a class): a nonmember function of
the class that has access to all the members of the
class
• Use the reserved word friend in the function
prototype in the class definition
C++ Programming: Program Design Including Data Structures, Sixth Edition 11
Definition of a friend Function
• "friend" doesn’t appear in function definition
• When writing the friend function definition
– The name of the class and the scope resolution operator
are not used
C++ Programming: Program Design Including Data Structures, Sixth Edition 12
Operator Functions as Member
and Nonmember Functions
• To overload (), [], ->, or = for a class, the function
must be a member of the class
• If op is overloaded for opOverClass:
– If the leftmost operand of op is an object of a different
type, the overloading function must be a nonmember
(friend) of the class
– If the overloading function for op is a member of
opOverClass, then when applying op on objects of
type opOverClass, the leftmost operand must be of
type opOverClass
C++ Programming: Program Design Including Data Structures, Sixth Edition 13
Overloading Binary Operators
• If # represents a binary operator (e.g., + or ==) that
is to be overloaded for rectangleType
– It can be overloaded as either a member function of the
class or as a friend function
C++ Programming: Program Design Including Data Structures, Sixth Edition 14
Overloading the Binary Operators
as Member Functions
• Function prototype (included in the class definition):
• Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 15
Overloading the Arithmetic or
Relational Operators
• Function prototype (included in class definition):
• Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 16
Overloading the Stream Insertion
(<<) and Extraction (>>) Operators
• Consider the expression:
cout << myRectangle;
– Leftmost operand is an ostream object, not a
rectangleType object
• Thus, the operator function that overloads << for
rectangleType must be a nonmember function
of the class
– Same applies to the function that overloads >>
C++ Programming: Program Design Including Data Structures, Sixth Edition 17
Overloading the
Stream Insertion Operator (<<)
• Function prototype:
• Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 18
Overloading the Stream Extraction
Operator (>>)
• Function prototype:
• Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 19
Overloading the Assignment
Operator (=)
• Function prototype:
• Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 20
Overloading Unary Operators
• To overload a unary operator for a class:
– If the operator function is a member of the class, it has no
parameters
– If the operator function is a nonmember (i.e., a friend
function), it has one parameter
C++ Programming: Program Design Including Data Structures, Sixth Edition 21
Overloading the Increment (++)
and Decrement (--) Operators
• General syntax to overload the pre-increment
operator ++ as a member function
– Function prototype:
– Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 22
Overloading the Increment (++) and
Decrement (--) Operators (cont’d.)
• General syntax to overload the pre-increment
operator ++ as a nonmember function:
– Function prototype:
– Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 23
Overloading the Increment (++) and
Decrement (--) Operators (cont’d.)
• General syntax to overload the post-increment
operator ++ as a member function:
– Function prototype:
– Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 24
Overloading the Increment (++) and
Decrement (--) Operators (cont’d.)
• Syntax to overload the post-increment operator ++ as
a nonmember function:
– Function prototype:
– Function definition:
C++ Programming: Program Design Including Data Structures, Sixth Edition 25
Operator Overloading:
Member Versus Nonmember
• Some operators must be overloaded as member
functions and some must be overloaded as
nonmember (friend) functions
• Binary arithmetic operator + can be overloaded
either way
– As a member function, operator + has direct access to
data members of one of the objects
– Need to pass only one object as a parameter
C++ Programming: Program Design Including Data Structures, Sixth Edition 26
Operator Overloading:
Member Versus Nonmember (cont’d.)
• Overload + as a nonmember function
– Must pass both objects as parameters
– Code may be somewhat clearer this way
C++ Programming: Program Design Including Data Structures, Sixth Edition 27
Classes and Pointer Member
Variables (Revisited)
• Recall that assignment operator copies member
variables from one object to another of the same
type
– Does not work well with pointer member variables
• Classes with pointer member variables must:
– Explicitly overload the assignment operator
– Include the copy constructor
– Include the destructor
C++ Programming: Program Design Including Data Structures, Sixth Edition 28
Operator Overloading:
One Final Word
• If an operator op is overloaded for a class, e.g.,
rectangleType
– When you use op on objects of type rectangleType,
the body of the function that overloads the operator op
for the class rectangleType executes
– Therefore, whatever code you put in the body of the
function executes
C++ Programming: Program Design Including Data Structures, Sixth Edition 29
Overloading the Array Index
(Subscript) Operator ([])
• Syntax to declare operator[] as a member of a
class for nonconstant arrays:
• Syntax to declare operator[] as a member of a
class for constant arrays:
C++ Programming: Program Design Including Data Structures, Sixth Edition 30
Function Overloading
• Overloading a function: several functions with the
same name, but different parameters
– Parameter list determines which function will execute
– Must provide the definition of each function
C++ Programming: Program Design Including Data Structures, Sixth Edition 31
Templates
• Template: a single code body for a set of related
functions (function template) and related classes
(class template)
• Syntax:
– Type is the data type
– Declaration is either a function declaration or a class
declaration
C++ Programming: Program Design Including Data Structures, Sixth Edition 32
Templates (cont’d.)
• class in the heading refers to any user-defined
type or built-in type
• Type: a formal parameter to the template
• Just as variables are parameters to functions, data
types are parameters to templates
C++ Programming: Program Design Including Data Structures, Sixth Edition 33
Function Templates
• Syntax of the function template:
• Type is a formal parameter of the template used to:
– Specify type of parameters to the function
– Specify return type of the function
– Declare variables within the function
C++ Programming: Program Design Including Data Structures, Sixth Edition 34
Class Templates
• Class template: a single code segment for a set of
related classes
– Called parameterized types
• Syntax:
• A template instantiation can be created with either a
built-in or user-defined type
• The function members of a class template are
considered to be function templates
C++ Programming: Program Design Including Data Structures, Sixth Edition 35
Header File and Implementation
File of a Class Template
• Passing a parameter to a function takes effect at run
time
• Passing a parameter to a class template takes effect
at compile time
• Cannot compile the implementation file
independently of the client code
– Can put class definition and definitions of the function
templates directly in the client code
– Can put class definition and the definitions of the function
templates in the same header file
C++ Programming: Program Design Including Data Structures, Sixth Edition 36
Header File and Implementation
File of a Class Template (cont’d.)
• Another alternative: put class definition and function
definitions in separate files
– Include directive to implementation file at the end of
header file
• In either case, function definitions and client code
are compiled together
C++ Programming: Program Design Including Data Structures, Sixth Edition 37
Summary
• An operator that has different meanings with
different data types is said to be overloaded
• Operator function: a function that overloads an
operator
− operator is a reserved word
− Operator functions are value-returning
• Operator overloading provides the same concise
notation for user-defined data types as for built-in
data types
C++ Programming: Program Design Including Data Structures, Sixth Edition 38
Summary (cont’d.)
• Only existing operators can be overloaded
• The pointer this refers to the object
• A friend function is a nonmember of a class
• If an operator function is a member of a class
– The leftmost operand of the operator must be a class
object (or a reference to a class object) of that operator’s
class
C++ Programming: Program Design Including Data Structures, Sixth Edition 39
Summary (cont’d.)
• Classes with pointer variables must overload the
assignment operator, and include both a copy
constructor and deconstructor
• Templates:
– Function template: a single code segment for a set of
related functions
– Class template: a single code segment for a set of related
classes
• Are called parameterized types
C++ Programming: Program Design Including Data Structures, Sixth Edition 40