Title: Chapter 15: Operator Overloading
1C Programming From Problem Analysis to Program
Design, Fifth Edition
- Chapter 15 Operator Overloading
2Objectives
- In this chapter, you will
- Learn about overloading
- Become aware of the restrictions on operator
overloading - Examine the pointer this
- Learn about friend functions
3Objectives (cont'd.)
- Explore the members and nonmembers of a class
- Discover how to overload various operators
- Learn about templates
- Explore how to construct function templates and
class templates
4Why Operator Overloading Is Needed
- Consider the following statements
- Which of the following would you prefer?
5Why Operator Overloading is Needed (cont'd.)
- Operator overloading extend definition of an
operator to work with a user-defined data type - The only built-in operations on classes are
assignment and member selection - Other operators cannot be applied directly to
class objects - C allows you to extend the definitions of most
of the operators to work with classes
6Operator Overloading
- Can overload most C operators
- Cannot create new operators
- Most existing operators can be overloaded to
manipulate class objects - Write an operator function to overload an
operator - Use reserved word operator
- Example write a function called operatorgt
7Syntax for Operator Functions
- The syntax of an operator function heading
- The operator function is value-returning
- operator is a reserved word
- To overload an operator for a class
- Include operator function in the class definition
- Write the definition of the operator function
8Overloading an Operator Some Restrictions
- Cannot change precedence or associativity
- Default arguments cannot be used
- Cannot change number of arguments
- Cannot create new operators
- Cannot overload . . ? sizeof
- How 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
9Pointer 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
10Friend Functions of Classes
- Friend function (of a class) nonmember function
of the class that has access to all the members
of the class - To make a function friend to a class
- Reserved word friend precedes the function
prototype in the class definition
11Definition of a friend Function
- "friend" doesnt appear in function definition
- When writing the friend function definition
- The name of the class and the scope resolution
operator are not used
12Operator Functions as Member Functions and
Nonmember Functions
- To overload (), , -gt, or for a class,
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
13Operator Functions as Member Functions and
Nonmember Functions (contd.)
14Operator Functions as Member Functions and
Nonmember Functions (contd.)
15Overloading Binary Operators
- If represents a binary operator (e.g., or )
that is to be overloaded for rectangleType - Operator can be overloaded as either a member
function of the class or as a friend function
16Overloading the Binary Operators as Member
Functions
17Overloading the Binary Operators (Arithmetic or
Relational) as Nonmember Functions
18Overloading the Stream Insertion (ltlt) and
Extraction (gtgt) Operators
- Consider the expression
- cout ltlt myRectangle
- The leftmost operand of ltlt is an ostream object,
not an object of type rectangleType - Thus, the operator function that overloads ltlt for
rectangleType must be a nonmember function of the
class - The same applies to the function that overloads gtgt
19Overloading the Stream Insertion Operator (ltlt)
20Overloading the Stream Extraction Operator (gtgt)
21Overloading the Assignment Operator ()
22Overloading 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., it
is a friend function), it has one parameter
23Overloading the Increment () and Decrement (--)
Operators
- General syntax to overload the pre-increment
operator as a member function
24Overloading the Increment () and Decrement (--)
Operators (cont'd.)
- General syntax to overload the pre-increment
operator as a nonmember function
25Overloading the Increment () and Decrement (--)
Operators (cont'd.)
- General syntax to overload the post-increment
operator as a member function
26Overloading the Increment () and Decrement (--)
Operators (cont'd.)
- Syntax to overload the post-increment operator
as a nonmember function
27Operator Overloading Member versus Nonmember
- Certain operators must be overloaded as member
functions and some must be overloaded as
nonmember (friend) functions - The binary arithmetic operator can be
overloaded either way - Overload 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
28Operator Overloading Member versus Nonmember
(cont'd.)
- Overload as a nonmember function
- Must pass both objects as parameters
- Could require additional memory and time to make
a local copy of the data - For efficiency purposes, overload operators as
member functions
29Classes and Pointer Member Variables (Revisited)
- Classes with pointer member variables must
- Explicitly overload the assignment operator
- Include the copy constructor
- Include the destructor
30Operator Overloading One Final Word
- Suppose that an operator op is overloaded for a
classsay, rectangleType - Whenever we 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
31Programming Example Complex Numbers
- Complex number number of the form a ib, in
which i2 -1 and a and b are real numbers - Addition and multiplication of complex numbers
are defined by the following rules - (a ib) (c id) (a c) i(b d )
- (a ib) (c id) (ac - bd) i(ad bc)
- C has no built-in data type that allows us to
manipulate complex numbers - Construct a data type, complexType, that can be
used to process complex numbers
32Programming Example Complex Numbers (contd.)
- Overload
- Stream insertion
- Stream extraction
-
-
33Programming Example Complex Numbers (contd.)
34Programming Example Complex Numbers (contd.)
35Programming Example Complex Numbers (contd.)
36Programming Example Complex Numbers (contd.)
- Output a complex number in the form (a, b)
- Output the left parenthesis, (
- Output the real part
- Output the comma and a space
- Output the imaginary part
- Output the right parenthesis, )
37Programming Example Complex Numbers (contd.)
38Programming Example Complex Numbers (contd.)
- The input is of the form (3, 5)
- Read this complex number
- Read and discard the left parenthesis
- Read and store the real part
- Read and discard the comma
- Read and store the imaginary part
- Read and discard the right parenthesis
39Programming Example Complex Numbers (contd.)
40Overloading 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
41Function Overloading
- Overloading a function several functions with
the same name, but different parameters - Parameter types determine which function will
execute - Must provide the definition of each function
42Templates
- Templates a single code body for a set of
related functions (called function template) and
related classes (called class template) - Syntax
-
- where Type is the type of the data and
declaration is either a function declaration or a
class declaration
43Templates (cont'd.)
- The word class in the heading refers to any
user-defined type or built-in type - Type is called a formal parameter to the template
- Just as variables are parameters to functions
- Data types are parameters to templates
44Function Templates
- The syntax of the function template is
-
-
- where Type is called a formal parameter of the
template - Type
- Specifies type of parameters to the function
- Specifies return type of the function
- Declares variables within the function
45Class Templates
- Class templates a single code segment represents
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 function templates
46Header 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
47Header File and Implementation File of a Class
Template (cont'd.)
- Another alternative put class definition and
function definitions in separate files - However, include directive to implementation file
at the end of header file - In either case, function definitions and client
code are compiled together - We will put the class definition and the function
definitions in the same header file
48Summary
- An operator that has different meanings with
different data types is said to be overloaded - Any function that overloads an operator is called
an operator function - 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
49Summary (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 operators class
50Summary (cont'd.)
- Every instance of an overloaded function has
different sets of parameters - 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 - Called parameterized types