11.ParametersIntroNotes

Download Report

Transcript 11.ParametersIntroNotes

Parameter Passing
Mechanisms
Reference Parameters
Read §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
Description
Type
Movement
Name
IP address
string
______
ipAddr
first block
string
______
info1
second block
string
______
info2
third block
string
______
info3
fourth block
string
______
info4
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 _______________
______________ as arguments, which our function
will then _______________________.
Parameters used up to now are called _________
parameters; they are built as __________ of their
arguments.
Changing a value parameter changes the
not its corresponding
So, we need a different kind of parameter.
.
8
Solution: Reference Parameters
A reference parameter is an _________ (i.e.,
another name) for its corresponding argument.
They share _______________________
Changing the value of a reference parameter
____ the value of its corresponding
argument.
In C++, reference parameters are declared
with an ____________________(__) following the
parameter’s type (and before its name). & is also the
"address of"
operator
9
Coding
void chopIPAddress(string ipAddr,
{
// value: TO
_____________ info1,
// reference: TO-BACK
_____________ info2,
// reference: TO-BACK
_____________ info3,
// reference: TO-BACK
_____________ info4,
// reference: TO-BACK
int dot1 = ipAddr.find(".", 0);
assert(dot1 != string::npos);
info1 = ipAddr.substr(0, dot1);
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,___________________________
___________________________);
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
_________ of the argument ipAddress is stored there
– Each of the parameters info1, info2, info3, info4
is an ________ of the corresponding argument —
part1, part2, part3, part4; they ____________
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 _________
Memory
chopIPAddress(ipAddress, part1, part2
part3, part4);
14
2. info1, ..., info4 are created
as aliases for part1, ..., part4
ipAddress 153.106.4.23
?
part1
________
part2
?
________
part3
?
________
part4
?
________
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
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
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
106
part2
info2
part3
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
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
106
part2
part3
4
part4
23
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 parameter’s 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
Consider
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
Solution
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