3.5. Defining a Member Function with a
Parameter
In our car analogy
from Section
3.2, we mentioned that pressing a car's gas pedal
sends a message to the car to perform a task—make the car go faster. But how
fast should the car accelerate? As you know, the farther down you press the
pedal, the faster the car accelerates. So the message to the car includes both
the task to perform and additional information that helps the car perform the
task. This additional information is known as a parameter—the value
of the parameter helps the car determine how fast to accelerate. Similarly, a
member function can require one or more parameters that represent additional
data it needs to perform its task. A function call supplies values—called arguments—for each of
the function's parameters. For example, to make a deposit into a bank account,
suppose a deposit member function of an Account
class specifies a parameter that represents the deposit amount. When the
deposit member function is called, an argument
value representing the deposit amount is copied to the member function's
parameter. The member function then adds that amount to the account
balance.
Defining and Testing Class GradeBook
Our next example (Fig. 3.3) redefines class
GradeBook (lines 14–23) with a displayMessage member function (lines 18–22) that displays the course name
as part of the welcome message. The new version of displayMessage
requires a parameter (courseName in line 18)
that represents the course name to output.
Fig. 3.3. Define class GradeBook with a member
function that takes a parameter, create a GradeBook object and call its
displayMessage function.
1 // Fig. 3.3: fig03_03.cpp
2 // Define class GradeBook with a member function that takes a parameter;
3 // Create a GradeBook object and call its displayMessage function.
4 #include <iostream>
5 using std::cout;
6 using std::cin;
7 using std::endl;
8
9 #include <string> // program uses C++ standard string class
10 using std::string;
11 using std::getline;
12
13 // GradeBook class definition
14 class GradeBook
15 {
16 public:
17 // function that displays a welcome message to the GradeBook user
18 void displayMessage( string courseName )
19 {
20 cout << "Welcome to the grade book for\n" << courseName << "!"
21 << endl;
22 } // end function displayMessage
23 }; // end class GradeBook
24
25 // function main begins program execution
26 int main()
27 {
28 string nameOfCourse; // string of characters to store the course name
29 GradeBook myGradeBook; // create a GradeBook object named myGradeBook
30
31 // prompt for and input course name
32 cout << "Please enter the course name:" << endl;
33 getline( cin, nameOfCourse ); // read a course name with blanks
34 cout << endl; // output a blank line
35
36 // call myGradeBook's displayMessage function
37 // and pass nameOfCourse as an argument
38 myGradeBook.displayMessage( nameOfCourse );
39 return 0; // indicate successful termination
40 } // end main
|
Please enter the course name:
CS101 Introduction to C++ Programming
Welcome to the grade book for
CS101 Introduction to C++ Programming!
|
Before discussing the new features of
class GradeBook, let's see how the new class is used in main
(lines 26–40). Line 28 creates a variable of type string called nameOfCourse that will be used to store the course name entered by the
user. A variable of type string represents a
string of characters such as "CS101 Introduction to C++ Programming". A string is actually an object of the C++ Standard
Library class string. This class is defined in
header file <string>, and the name
string, like cout, belongs to namespace std. To enable line 28 to compile, line 9 includes the
<string> header file. Note that the using declaration in
line 10 allows us to simply write string in line 28 rather than
std::string. For now, you can think of string variables like
variables of other types such as int. You'll see additional
string capabilities in Section
3.10.
Line 29 creates an object of class GradeBook named
myGradeBook. Line 32 prompts the user to enter a
course name. Line 33 reads the name from the user and assigns it to the
nameOfCourse variable, using the library function getline to perform
the input. Before we explain this line of code, let's explain why we cannot
simply write
to obtain the course name. In our sample
program execution, we use the course name "CS101 Introduction to C++
Programming," which contains multiple words. (Recall that we highlight
user-supplied input in bold.) When cin is used
with the stream extraction operator, it reads characters until the first
white-space character is reached. Thus, only "CS101" would be read by the preceding statement. The rest of the
course name would have to be read by subsequent input operations.
In this example, we'd like the user to
type the complete course name and press Enter to submit it to the program, and we'd like to store the
entire course name in the string variable nameOfCourse. The function call getline( cin, nameOfCourse ) in line 33 reads characters (including the space
characters that separate the words in the input) from the standard input stream
object cin (i.e., the keyboard) until the newline
character is encountered, places the characters in the string variable
nameOfCourse and discards the newline
character. Note that when you press Enter while typing program input, a newline is inserted in the
input stream. Also note that the <string>
header file must be included in the program to use function getline and that the name getline belongs to namespace
std.
Line 38 calls myGradeBook's displayMessage
member function. The nameOfCourse variable in
parentheses is the argument that is passed to member function
displayMessage so that it can perform its
task. The value of variable nameOfCourse in main becomes the value of member function
displayMessage's parameter courseName in line 18. When you execute this program, notice that
member function displayMessage outputs as part
of the welcome message the course name you type (in our sample execution,
CS101 Introduction to C++ Programming).
More on Arguments and
Parameters
To specify that a function requires
data to perform its task, you place additional information in the function's
parameter list, which is located in the parentheses following the
function name. The parameter list may contain any number of parameters,
including none at all (represented by empty parentheses as in Fig.
3.1, line 13) to indicate that a function does
not require any parameters. Member function displayMessage's parameter list (Fig. 3.3,
line 18) declares that the function requires one parameter. Each parameter must
specify a type and an identifier. In this case, the type string and the
identifier courseName indicate that member
function displayMessage requires a string to perform its task. The member function body uses the
parameter courseName to access the value that
is passed to the function in the function call (line 38 in main). Lines
20–21 display parameter courseName's value as part
of the welcome message. Note that the parameter variable's name (line 18) can be
the same as or different from the argument variable's name (line 38)—you'll see
why in Chapter
6, Functions and an Introduction to Recursion.
A function can specify multiple
parameters by separating each parameter from the next with a comma (we'll see an
example in Figs.
6.3–6.4). The number and order of arguments in a function call
must match the number and order of parameters in the parameter list of the
called member function's header. Also, the argument types in the function call
must be consistent with the types of the corresponding parameters in the
function header. (As you'll see in subsequent chapters, an argument's type and
its corresponding parameter's type need not always be identical, but they must
be "consistent.") In our example, the one string argument in the
function call (i.e., nameOfCourse) exactly matches the one
string parameter in the member-function definition (i.e.,
courseName).
Common Programming Error 3.4
|
Placing a semicolon after the right
parenthesis enclosing the parameter list of a function definition is a syntax
error. |
Common Programming Error
3.5
|
Defining
a function parameter again as a local variable in the function is a compilation
error. |
Updated UML Class Diagram for Class
GradeBook
The UML class diagram of Fig. 3.4 models class
GradeBook of Fig. 3.3. Like the
class GradeBook defined in Fig.
3.1, this GradeBook class contains public member function
displayMessage. However, this version of displayMessage has a parameter. The UML models a parameter by listing
the parameter name, followed by a colon and the parameter type in the
parentheses following the operation name. The UML has its own data types similar
to those of C++. The UML is language independent—it is used with many different
programming languages—so its terminology does not exactly match that of C++. For
example, the UML type String corresponds to the C++ type
string. Member function displayMessage of class
GradeBook (Fig.
3.3, lines 18–22) has a string parameter named courseName,
so Fig. 3.4 lists
courseName : String between the parentheses following the operation
name displayMessage. Note that this version of the GradeBook
class still does not have any data members.
