Parameter Passing Mechanisms
Download
Report
Transcript Parameter Passing Mechanisms
Parameter Passing
Mechanisms
Reference Parameters
§10.1 - §10.3
1
ipv6
16 bytes
Problem
Find/locate
IP address
IPv4 (Internet Protocol) addresses are expressed
using "dotted decimal" notation:
aaa.bbb.ccc.ddd
where aaa, bbb, ccc, and ddd are 1-byte (8-bit)
integers that provide network or host information.
Using OCD, design and implement a function
that, given a string containing an IP address,
decomposes it into its four network/host
information blocks (aaa, bbb, ccc, ddd)
and returns these values.
2
Preliminary Analysis
Our function can receive the IP address
through a string parameter.
This problem requires that our function
somehow communicate four values (the
network/host information blocks ) back to its
caller.
A function cannot return multiple values — the
return statement only returns one value:
return expression;
3
Behavior
Our subprogram should receive from its caller
an IP address (a string). It should compute
and pass back its four network/host
information blocks or halt execution if it did
not receive a valid IP address.
4
Objects
Type
Movement
IP address
string
to
first block
string
back
info1
second block
string
back
info2
third block
string
back
info3
fourth block
string
back
info4
Description
Name
ipAddr
Where?
main() or in
function
5
Operations
Description
Predefined? Library?
Name
receive a string
yes
built-in
none
select part of a
string
yes
string
substr()
search a string
yes
string
find()
halt if error
yes
cassert
assert()
pass back 4
strings
yes
built-in
??
6
Algorithm
0. Receive ipAddress from caller and declare four variables
info1, info2, info3, and info4.
1. Fill info1 with appropriate substring of ipAddr or halt if it
can't be found.
2. Fill info2 with appropriate substring of ipAddr or halt if it
can't be found.
3. Fill info3 with appropriate substring of ipAddr or halt if it
can't be found.
4. Fill info4 with appropriate substring of ipAddr or halt if it
can't be found.
7
Discussion
Since a function cannot return 4 strings, we will
instead require the caller to pass it four string
variables as arguments, which our function
will then assign values.
Parameters used up to now are called value
parameters; they are built as copies of their
arguments.
Changing a value parameter changes the copy,
not its corresponding argument.
So, we need a different kind of parameter.
8
Solution: Reference Parameters
A reference parameter is an alias (i.e.,
another name) for its corresponding argument.
They share memory locations.
Changing the value of a reference parameter
changes the value of its corresponding
argument.
In C++, reference parameters are declared
with an ampersand (&) following the
& is also the
of"
parameter’s type (and before its name). "address
operator
9
Coding
void chopIPAddress(string ipAddr,
string & info1,
string & info2,
string & info3,
string & info4)
{
int dot1 = ipAddr.find(".", 0);
assert(dot1 != string::npos);
info1 = ipAddr.substr(0, dot1);
//
//
//
//
//
value: TO
reference:
reference:
reference:
reference:
BACK
BACK
BACK
BACK
int dot2 = ipAddr.find(".", dot1 + 1);
assert(dot2 != string::npos);
info2 = ipAddr.substr(dot1 + 1, dot2 - dot1 - 1);
int dot3 = ipAddr.find(".", dot2 + 1);
assert(dot3 != string::npos);
info3 = ipAddr.substr(dot2 + 1, dot3 - dot2 - 1);
assert(ipAddr.find(".", dot3 + 1) == string::npos);
info4 = ipAddr.substr(dot3 + 1, ipAddr.size() - dot3 - 1);
}
10
Testing
The caller must now supply a variable for
each reference parameter, to be "filled in"
by the function.
cout << "Enter an IP address: ";
string ipAddress, part1, part2, part3, part4;
cin >> ipAddress;
chopIPAddress(ipAddress, part1, part2,
part3, part4);
cout << "Network/Host blocks are:\n"
<< part1 << endl << part2 << endl
<< part3 << endl << part4 << endl;
11
Notes
When function chopIDAddress() is called:
– ipAddr is allocated a memory location and a
copy of the argument ipAddress is stored there
– Each of the parameters info1, info2, info3, info4
is an alias of the corresponding argument —
part1, part2, part3, part4; they share
the same memory location; that is,
info1 and part1 are names of the
same memory location, as are
info2 and part2,
info3 and part3,
info4 and part4.
12
0. Before the function call
ipAddress 153.106.4.23
?
part1
part2
?
part3
?
part4
?
Memory
cout << "Enter an IP address: ";
string ipAddress, part1, part2, part3, part4;
cin >> ipAddress;
13
1. ipAddr is created as a
copy of ipAddress
ipAddress 153.106.4.23
?
part1
part2
?
part3
?
part4
?
153.106.4.23 ipAddr
Memory
chopIPAddress(ipAddress, part1, part2
part3, part4);
14
2. info1, ..., info4 are created
as aliases for part1, ..., part4
ipAddress 153.106.4.23
?
part1
info1
part2
?
info2
part3
?
info3
part4
info4
?
153.106.4.23 ipAddr
Memory
chopIPAddress(ipAddress, part1, part2
part3, part4);
15
3. The function computes
info1, changing part1
ipAddress 153.106.4.23
153
part1
info1
part2
?
info2
part3
?
info3
part4
info4
?
153.106.4.23 ipAddr
Memory
int dot1 = ipAddr.find(".", 0);
assert(dot1 != string::npos);
info1 = ipAddr.substr(0, dot1);
16
4. The function computes
info2, changing part2
ipAddress 153.106.4.23
part1
153
info1
part2
106
info2
part3
info3
?
part4
info4
?
153.106.4.23 ipAddr
Memory
int dot2 = ipAddr.find(".", dot1 + 1);
assert(dot2 != string::npos);
info2 = ipAddr.substr(dot1 + 1, dot2 - dot1 - 1);
17
5. The function computes
info3, changing part3
ipAddress 153.106.4.23
part1
153
info1
part2
106
info2
part3
4
info3
part4
?
info4
153.106.4.23 ipAddr
Memory
int dot3 = ipAddr.find(".", dot2 + 1);
assert(dot3 != string::npos);
info3 = ipAddr.substr(dot2 + 1, dot3 - dot2 - 1);
18
6. The function computes
info4, changing part4
ipAddress 153.106.4.23
part1
153
info1
106
part2
info2
part3
4
info3
part4
23
info4
153.106.4.23 ipAddr
Memory
assert(ipAddr.find(".", dot3 + 1) == string::npos);
info4 = ipAddr.substr(dot3 + 1, ipAddr.size() - dot3 - 1);
19
7. The function returns,
destroying all parameters
ipAddress 153.106.4.23
part1
153
info1
106
part2
info2
part3
4
info3
part4
23
info4
153.106.4.23 ipAddr
Memory
. . .
}
20
8. part1, ... , part4
now contain the information!
ipAddress 153.106.4.23
part1
153
106
part2
part3
4
part4
23
Memory
cout << "Network/Host blocks are:\n"
<< part1 << endl << part2 << endl
<< part3 << endl << part4 << endl
21
Notes
By default, parameters are value parameters.
Reference parameters are specified by placing
an ampersand after the parameters type.
Reference parameters must be specified in
both a function’s prototype and its definition,
or a linking error will occur.
Variables must be passed as arguments for
reference parameters to fill, or a compiler
error will occur.
22
An Alternative to Value Parameters
Copying argument ipAddress consumes time.
Creating an alias for an argument takes almost
no time.
We could speed up calls to our function by
making parameter ipAddr a reference
parameter.
However, we then run the risk of changing
ipAddress if we mistakenly change ipAddr.
23
Constant reference parameters are reference
parameters whose declaration is preceded by the
keyword const.
void chopIPAddress(const string
string
string
string
string
// ...
&
&
&
&
&
ipAddr,
info1,
info2,
info3,
info4)
//
//
//
//
//
TO
BACK
BACK
BACK
BACK
Const reference parameters are read-only
reference parameters -- aliases of their
arguments -- but they cannot be changed.
24
0. Before the function call
ipAddress 153.106.4.23
?
part1
part2
?
part3
?
part4
?
Memory
25
1. ipAddr is created as a
const reference of original
ipAddress 153.106.4.23 ipAddr
part1
read-only
part2
part3
part4
Memory
26
2. The rest of the function
proceeds as before, except:
• all accesses to ipAddr now access ipAddress
instead of the copy.
• Any attempt to change ipAddr will generate a
compiler error (which makes sense, since its
movement is IN, not OUT).
27
Discussion
Copying time is not significant for simple types
(e.g., int, char, double, ...), but it is significant
for class types (e.g., string, RandomInt, ...).
So use value parameters to store simple type
arguments whose movement is TO.
Use reference parameters for arguments whose
movement is BACK or TO & BACK
Use const reference parameters to store class
arguments whose movement is TO.
28