As mentioned in Section 3.4, when an object of class GradeBook
(Fig. 3.5) is created, its data member courseName
is initialized to the empty string by default. What if you want to provide a course name when you create a GradeBook
object? Each class you declare can provide one or more constructors that can be used to initialize an object of the class when the object is created. A constructor is a special member function that must be defined with the same name as the class, so that the compiler can distinguish it from the class’s other member functions. An important difference between constructors and other functions is that constructors cannot return values, so they cannot specify a return type (not even void
). Normally, constructors are declared public
. In the early chapters, our classes will generally have one constructor—in later chapters, you’ll see how to create classes with more that one constructor using the technique of function overloading, which we introduce in Section 6.17.
C++ automatically calls a constructor for each object that’s created, which helps ensure that objects are initialized properly before they’re used in a program. The constructor call occurs when the object is created. If a class does not explicitly include constructors, the compiler provides a default constructor with no parameters. For example, when line 41 of Fig. 3.5 creates a GradeBook
object, the default constructor is called. The default constructor provided by the compiler creates a GradeBook
object without giving any initial values to the object’s fundamental type data members. For data members that are objects of other classes, the default constructor implicitly calls each data member’s default constructor to ensure that the data member is initialized properly. This is why the string
data member courseName
(in Fig. 3.5) was initialized to the empty string—the default constructor for class string
sets the string
’s value to the empty string.
In the example of Fig. 3.7, we specify a course name for a GradeBook
object when the object is created (e.g., line 47). In this case, the argument "CS101 Introduction to C++ Programming"
is passed to the GradeBook
object’s constructor (lines 14–18) and used to initialize the courseName
. Figure 3.7 defines a modified GradeBook
class containing a constructor with a string
parameter that receives the initial course name.
1 // Fig. 3.7: fig03_07.cpp
2 // Instantiating multiple objects of the GradeBook class and using
3 // the GradeBook constructor to specify the course name
4 // when each GradeBook object is created.
5 #include <iostream>
6 #include <string> // program uses C++ standard string class
7 using namespace std;
8
9 // GradeBook class definition
10 class GradeBook
11 {
12 public:
13 // constructor initializes courseName with string supplied as argument
14 explicit GradeBook( string name )
15 : courseName( name ) // member initializer to initialize courseName
16 {
17 // empty body
18 } // end GradeBook constructor
19
20 // function to set the course name
21 void setCourseName( string name )
22 {
23 courseName = name; // store the course name in the object
24 } // end function setCourseName
25
26 // function to get the course name
27 string getCourseName() const
28 {
29 return courseName; // return object's courseName
30 } // end function getCourseName
31
32 // display a welcome message to the GradeBook user
33 void displayMessage() const
34 {
35 // call getCourseName to get the courseName
36 cout << "Welcome to the grade book for
" << getCourseName()
37 << "!" << endl;
38 } // end function displayMessage
39 private:
40 string courseName; // course name for this GradeBook
41 }; // end class GradeBook
42
43 // function main begins program execution
44 int main()
45 {
46 // create two GradeBook objects
47 GradeBook gradeBook1( "CS101 Introduction to C++ Programming" );
48 GradeBook gradeBook2( "CS102 Data Structures in C++" );
49
50 // display initial value of courseName for each GradeBook
51 cout << "gradeBook1 created for course: " << gradeBook1.getCourseName()
52 << "
gradeBook2 created for course: " << gradeBook2.getCourseName()
53 << endl;
54 } // end main
gradeBook1 created for course: CS101 Introduction to C++ Programming
gradeBook2 created for course: CS102 Data Structures in C++