Chapter 4
Parameters
and Overloading
Copyright © 2017 Pearson Education, Ltd.
All rights reserved.
Learning Objectives
• Parameters
– Call-by-value
– Call-by-reference
– Mixed parameter-lists
• Overloading and Default Arguments
– Examples, Rules
• Testing and Debugging Functions
– assert Macro
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-2
Parameters
• Two methods of passing arguments
as parameters
• Call-by-value
– "copy" of value is passed
• Call-by-reference
– "address of" actual argument is passed
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-3
Call-by-Value Parameters
• Copy of actual argument passed
• Considered "local variable" inside function
• If modified, only "local copy" changes
– Function has no access to "actual argument"
from caller
• This is the default method
– Used in all examples thus far
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-4
Call-by-Value Example:
Display 4.1 Formal Parameter Used
as a Local Variable (1 of 3)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-5
Call-by-Value Example:
Display 4.1 Formal Parameter Used
as a Local Variable (2 of 3)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-6
Call-by-Value Example:
Display 4.1 Formal Parameter Used
as a Local Variable (3 of 3)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-7
Call-by-Value Pitfall
• Common Mistake:
– Declaring parameter "again" inside function:
double fee(int hoursWorked, int minutesWorked)
{
int quarterHours; // local variable
int minutesWorked // NO!
}
– Compiler error results
• "Redefinition error…"
• Value arguments ARE like "local variables"
– But function gets them "automatically"
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-8
Call-By-Reference Parameters
• Used to provide access to caller’s
actual argument
• Caller’s data can be modified by called function!
• Typically used for input function
– To retrieve data for caller
– Data is then "given" to caller
• Specified by ampersand, &, after type
in formal parameter list
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-9
Call-By-Reference Example:
Display 4.1 Call-by-Reference Parameters (1 of 3)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-10
Call-By-Reference Example:
Display 4.1 Call-by-Reference Parameters (2 of 3)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-11
Call-By-Reference Example:
Display 4.1 Call-by-Reference Parameters (3 of 3)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-12
Call-By-Reference Details
• What’s really passed in?
• A "reference" back to caller’s
actual argument!
– Refers to memory location of
actual argument
– Called "address", which is a unique number
referring to distinct place in memory
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-13
Constant Reference Parameters
• Reference arguments inherently
"dangerous"
– Caller’s data can be changed
– Often this is desired, sometimes not
• To "protect" data, & still pass by reference:
– Use const keyword
• void sendConstRef( const int &par1,
const int &par2);
• Makes arguments "read-only" by function
• No changes allowed inside function body
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-14
Parameters and Arguments
• Confusing terms, often used interchangeably
• True meanings:
– Formal parameters
• In function declaration and function definition
– Arguments
• Used to "fill-in" a formal parameter
• In function call (argument list)
– Call-by-value & Call-by-reference
• Simply the "mechanism" used in plug-in process
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-15
Mixed Parameter Lists
• Can combine passing mechanisms
• Parameter lists can include pass-by-value
and pass-by-reference parameters
• Order of arguments in list is critical:
void mixedCall(int & par1, int par2, double & par3);
– Function call:
mixedCall(arg1, arg2, arg3);
• arg1 must be integer type, is passed by reference
• arg2 must be integer type, is passed by value
• arg3 must be double type, is passed by reference
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-16
Choosing Formal Parameter Names
• Same rule as naming any identifier:
– Meaningful names!
• Functions as "self-contained modules"
– Designed separately from rest of program
– Assigned to teams of programmers
– All must "understand" proper function use
– OK if formal parameter names are same
as argument names
• Choose function names with same rules
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-17
Overloading
• Same function name
• Different parameter lists
• Two separate function definitions
• Function "signature"
– Function name & parameter list
– Must be "unique" for each function definition
• Allows same task performed on different data
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-18
Overloading Example: Average
• Function computes average of 2 numbers:
double average(double n1, double n2)
{
return ((n1 + n2) / 2.0);
}
• Now compute average of 3 numbers:
double average(double n1, double n2, double n3)
{
return ((n1 + n2) / 2.0);
}
• Same name, two functions
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-19
Overloaded Average() Cont’d
• Which function gets called?
• Depends on function call itself:
– avg = average(5.2, 6.7);
• Calls "two-parameter average()"
– avg = average(6.5, 8.5, 4.2);
• Calls "three-parameter average()"
• Compiler resolves invocation based on
signature of function call
– "Matches" call with appropriate function
– Each considered separate function
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-20
Overloading Pitfall
• Only overload "same-task" functions
– A mpg() function should always perform
same task, in all overloads
– Otherwise, unpredictable results
• C++ function call resolution:
– 1st: looks for exact signature
– 2nd: looks for "compatible" signature
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-21
Overloading Resolution
• 1st: Exact Match
– Looks for exact signature
• Where no argument conversion required
• 2nd: Compatible Match
– Looks for "compatible" signature where
automatic type conversion is possible:
• 1st with promotion (e.g., intàdouble)
– No loss of data
• 2nd with demotion (e.g., doubleàint)
– Possible loss of data
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-22
Overloading Resolution Example
• Given following functions:
– 1. void f(int n, double m);
2. void f(double n, int m);
3. void f(int n, int m);
– These calls:
f(98, 99); à Calls #3
f(5.3, 4); à Calls #2
f(4.3, 5.2); à Calls ???
• Avoid such confusing overloading
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-23
Automatic Type Conversion
and Overloading
• Numeric formal parameters typically
made "double" type
• Allows for "any" numeric type
– Any "subordinate" data automatically promoted
• int à double
• float à double
• char à double *More on this later!
• Avoids overloading for different numeric types
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-24
Automatic Type Conversion
and Overloading Example
• double mpg(double miles, double gallons)
{
return (miles/gallons);
}
• Example function calls:
– mpgComputed = mpg(5, 20);
• Converts 5 & 20 to doubles, then passes
– mpgComputed = mpg(5.8, 20.2);
• No conversion necessary
– mpgComputed = mpg(5, 2.4);
• Converts 5 to 5.0, then passes values to function
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-25
Default Arguments
• Allows omitting some arguments
• Specified in function declaration/prototype
– void showVolume( int length,
int width = 1,
int height = 1);
• Last 2 arguments are defaulted
– Possible calls:
• showVolume(2, 4, 6); //All arguments supplied
• showVolume(3, 5); //height defaulted to 1
• showVolume(7); //width & height defaulted to 1
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-26
Default Arguments Example:
Display 4.1 Default Arguments (1 of 2)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-27
Default Arguments Example:
Display 4.1 Default Arguments (2 of 2)
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-28
Testing and Debugging Functions
• Many methods:
– Lots of cout statements
• In calls and definitions
• Used to "trace" execution
– Compiler Debugger
• Environment-dependent
– assert Macro
• Early termination as needed
– Stubs and drivers
• Incremental development
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-29
The assert Macro
• Assertion: a true or false statement
• Used to document and check correctness
– Preconditions & Postconditions
• Typical assert use: confirm their validity
– Syntax:
assert(<assert_condition>);
• No return value
• Evaluates assert_condition
• Terminates if false, continues if true
• Predefined in library <cassert>
– Macros used similarly as functions
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-30
An assert Macro Example
• Given Function Declaration:
void computeCoin( int coinValue,
int& number,
int& amountLeft);
//Precondition: 0 < coinValue < 100
0 <= amountLeft <100
//Postcondition: number set to max. number
of coins
• Check precondition:
– assert ((0 < currentCoin) && (currentCoin < 100)
&& (0 <= currentAmountLeft) && (currentAmountLeft <
100));
– If precondition not satisfied à condition is false à program
execution terminates!
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-31
An assert Macro Example Cont’d
• Useful in debugging
• Stops execution so problem can
be investigated
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-32
assert On/Off
• Preprocessor provides means
• #define NDEBUG
#include <cassert>
• Add "#define" line before #include line
– Turns OFF all assertions throughout
program
• Remove "#define" line (or comment out)
– Turns assertions back on
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-33
Fundamental Testing Rule
• To write "correct" programs
• Minimize errors, "bugs"
• Ensure validity of data
– Test every function in a program where every
other function has already been
fully tested and debugged
– Avoids "error-cascading" &
conflicting results
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-39
Summary 1
• Formal parameter is placeholder, filled in with actual
argument in function call
• Call-by-value parameters are "local copies" in
receiving function body
– Actual argument cannot be modified
• Call-by-reference passes memory address of actual
argument
– Actual argument can be modified
– Argument MUST be variable, not constant
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-40
Summary 2
• Multiple definitions of same function name
possible: called overloading
• Default arguments allow function call to
"omit" some or all arguments in list
– If not provided à default values assigned
• assert macro initiates program
termination if assertions fail
• Functions should be tested independently
– As separate compilation units, with drivers
Copyright © 2017 Pearson Education, Ltd. All rights reserved. 4-41