CSC 213 Chapter 7, Fall 2007
Notre Dame University–Louaize · Program Design and Data Abstraction II · 79 pages
Showing the first 10 of 79 pages. Download the PDF to see all of it.
More CSC 213 files
Show the text of this chapter
2003 Prentice Hall, Inc. All rights reserved.
1
Chapter 7: Classes Part II
Outline
7.1
Introduction
7.2
const (Constant) Objects and const Member Functions
7.3
Composition: Objects as Members of Classes
7.4
friend Functions and friend Classes
7.5
Using the this Pointer
7.6
Dynamic Memory Management with Operators new and delete
7.7
static Class Members
7.8
Data Abstraction and Information Hiding
7.8.1
Example: Array Abstract Data Type
7.8.2
Example: String Abstract Data Type
7.8.3
Example: Queue Abstract Data Type
7.9
Container Classes and Iterators
7.10
Proxy Classes
2003 Prentice Hall, Inc. All rights reserved.
2
7.1 Introduction
• Classes
• Data abstraction
• Object-based programming (OBP)
– Chapters 6-8
• Inheritance and polymorphism
– Chapters 9 and 10
2003 Prentice Hall, Inc. All rights reserved.
3
7.2 const (Constant) Objects and const
Member Functions
• Principle of least privilege
– Only allow modification of necessary objects
• Keyword const
– Specify object not modifiable
– Compiler error if attempt to modify const object
– Example
const Time noon( 12, 0, 0 );
• Declares const object noon of class Time
• Initializes to 12
2003 Prentice Hall, Inc. All rights reserved.
4
7.2 const (Constant) Objects and const
Member Functions
• const member functions
– Member functions for const objects must also be const
• Cannot modify object
– Specify const in both prototype and definition
• Prototype
– After parameter list
• Definition
– Before beginning left brace
2003 Prentice Hall, Inc. All rights reserved.
5
7.2 const (Constant) Objects and const
Member Functions
• Constructors and destructors
– Cannot be const
– Must be able to modify objects
• Constructor
– Initializes objects
• Destructor
– Performs termination housekeeping
2003 Prentice Hall, Inc.
All rights reserved.
Outline
6
time5.h (1 of 2)
1 // Fig. 7.1: time5.h
2 // Definition of class Time.
3 // Member functions defined in time5.cpp.
4 #ifndef TIME5_H
5 #define TIME5_H
6
7 class Time {
8
9 public:
10 Time( int = 0, int = 0, int = 0 ); // default constructor
11
12 // set functions
13 void setTime( int, int, int ); // set time
14 void setHour( int ); // set hour
15 void setMinute( int ); // set minute
16 void setSecond( int ); // set second
17
18 // get functions (normally declared const)
19 int getHour() const; // return hour
20 int getMinute() const; // return minute
21 int getSecond() const; // return second
22
23 // print functions (normally declared const)
24 void printUniversal() const; // print universal time
25 void printStandard(); // print standard time
Declare const get functions.
Declare const function
printUniversal.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
7
time5.h (2 of 2)
26
27 private:
28 int hour; // 0 - 23 (24-hour clock format)
29 int minute; // 0 - 59
30 int second; // 0 - 59
31
32 }; // end class Time
33
34 #endif
2003 Prentice Hall, Inc.
All rights reserved.
Outline
8
time5.cpp (1 of 4)
1 // Fig. 7.2: time5.cpp
2 // Member-function definitions for class Time.
3 #include <iostream>
4
5 using std::cout;
6
7 #include <iomanip>
8
9 using std::setfill;
10 using std::setw;
11
12 // include definition of class Time from time5.h
13 #include "time5.h"
14
15 // constructor function to initialize private data;
16 // calls member function setTime to set variables;
17 // default values are 0 (see class definition)
18 Time::Time( int hour, int minute, int second )
19 {
20 setTime( hour, minute, second );
21
22 } // end Time constructor
23
2003 Prentice Hall, Inc.
All rights reserved.
Outline
9
time5.cpp (2 of 4)
24 // set hour, minute and second values
25 void Time::setTime( int hour, int minute, int second )
26 {
27 setHour( hour );
28 setMinute( minute );
29 setSecond( second );
30
31 } // end function setTime
32
33 // set hour value
34 void Time::setHour( int h )
35 {
36 hour = ( h >= 0 && h < 24 ) ? h : 0;
37
38 } // end function setHour
39
40 // set minute value
41 void Time::setMinute( int m )
42 {
43 minute = ( m >= 0 && m < 60 ) ? m : 0;
44
45 } // end function setMinute
46
2003 Prentice Hall, Inc.
All rights reserved.
Outline
10
time5.cpp (3 of 4)
47 // set second value
48 void Time::setSecond( int s )
49 {
50 second = ( s >= 0 && s < 60 ) ? s : 0;
51
52 } // end function setSecond
53
54 // return hour value
55 int Time::getHour() const
56 {
57 return hour;
58
59 } // end function getHour
60
61 // return minute value
62 int Time::getMinute() const
63 {
64 return minute;
65
66 } // end function getMinute
67
const functions do not
modify objects.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
11
time5.cpp (4 of 4)
68 // return second value
69 int Time::getSecond() const
70 {
71 return second;
72
73 } // end function getSecond
74
75 // print Time in universal format
76 void Time::printUniversal() const
77 {
78 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
79 << setw( 2 ) << minute << ":"
80 << setw( 2 ) << second;
81
82 } // end function printUniversal
83
84 // print Time in standard format
85 void Time::printStandard() // note lack of const declaration
86 {
87 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
88 << ":" << setfill( '0' ) << setw( 2 ) << minute
89 << ":" << setw( 2 ) << second
90 << ( hour < 12 ? " AM" : " PM" );
91
92 } // end function printStandard
const functions do not
modify objects.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
12
fig07_03.cpp
(1 of 2)
1 // Fig. 7.3: fig07_03.cpp
2 // Attempting to access a const object with
3 // non-const member functions.
4
5 // include Time class definition from time5.h
6 #include "time5.h"
7
8 int main()
9 {
10 Time wakeUp( 6, 45, 0 ); // non-constant object
11 const Time noon( 12, 0, 0 ); // constant object
12
Declare noon a const
object.
Note that non-const
constructor can initialize
const object.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
13
fig07_03.cpp
(2 of 2)
fig07_03.cpp
output (1 of 1)
13 // OBJECT MEMBER FUNCTION
14 wakeUp.setHour( 18 ); // non-const non-const
15
16 noon.setHour( 12 ); // const non-const
17
18 wakeUp.getHour(); // non-const const
19
20 noon.getMinute(); // const const
21 noon.printUniversal(); // const const
22
23 noon.printStandard(); // const non-const
24
25 return 0;
26
27 } // end main
d:\cpphtp4_examples\ch07\fig07_01\fig07_01.cpp(16) : error C2662:
'setHour' : cannot convert 'this' pointer from 'const class Time'
to 'class Time &'
Conversion loses qualifiers
d:\cpphtp4_examples\ch07\fig07_01\fig07_01.cpp(23) : error C2662:
'printStandard' : cannot convert 'this' pointer from 'const class
Time' to 'class Time &'
Conversion loses qualifiers
Attempting to invoke non-
const member function on
const object results in
compiler error.
Attempting to invoke non-
const member function on
const object results in
compiler error even if
function does not modify
object.
2003 Prentice Hall, Inc. All rights reserved.
14
7.2 const (Constant) Objects and const
Member Functions
• Member initializer syntax
– Initializing with member initializer syntax
• Can be used for
– All data members
• Must be used for
– const data members
– Data members that are references
2003 Prentice Hall, Inc.
All rights reserved.
Outline
15
fig07_04.cpp
(1 of 3)
1 // Fig. 7.4: fig07_04.cpp
2 // Using a member initializer to initialize a
3 // constant of a built-in data type.
4 #include <iostream>
5
6 using std::cout;
7 using std::endl;
8
9 class Increment {
10
11 public:
12 Increment( int c = 0, int i = 1 ); // default constructor
13
14 void addIncrement()
15 {
16 count += increment;
17
18 } // end function addIncrement
19
20 void print() const; // prints count and increment
21
2003 Prentice Hall, Inc.
All rights reserved.
Outline
16
fig07_04.cpp
(2 of 3)
22 private:
23 int count;
24 const int increment; // const data member
25
26 }; // end class Increment
27
28 // constructor
29 Increment::Increment( int c, int i )
30 : count( c ), // initializer for non-const member
31 increment( i ) // required initializer for const member
32 {
33 // empty body
34
35 } // end Increment constructor
36
37 // print count and increment values
38 void Increment::print() const
39 {
40 cout << "count = " << count
41 << ", increment = " << increment << endl;
42
43 } // end function print
44
Declare increment as const
data member.
Member initializer list
separated from parameter list
by colon.
Member initializer syntax can
be used for non-const data
member count.
Member initializer syntax
must be used for const data
member increment.
Member initializer consists of
data member name
(increment) followed by
parentheses containing initial
value (c).
2003 Prentice Hall, Inc.
All rights reserved.
Outline
17
fig07_04.cpp
(3 of 3)
fig07_04.cpp
output (1 of 1)
45 int main()
46 {
47 Increment value( 10, 5 );
48
49 cout << "Before incrementing: ";
50 value.print();
51
52 for ( int j = 0; j < 3; j++ ) {
53 value.addIncrement();
54 cout << "After increment " << j + 1 << ": ";
55 value.print();
56 }
57
58 return 0;
59
60 } // end main
Before incrementing: count = 10, increment = 5
After increment 1: count = 15, increment = 5
After increment 2: count = 20, increment = 5
After increment 3: count = 25, increment = 5
2003 Prentice Hall, Inc.
All rights reserved.
Outline
18
fig07_05.cpp
(1 of 3)
1 // Fig. 7.5: fig07_05.cpp
2 // Attempting to initialize a constant of
3 // a built-in data type with an assignment.
4 #include <iostream>
5
6 using std::cout;
7 using std::endl;
8
9 class Increment {
10
11 public:
12 Increment( int c = 0, int i = 1 ); // default constructor
13
14 void addIncrement()
15 {
16 count += increment;
17
18 } // end function addIncrement
19
20 void print() const; // prints count and increment
21
2003 Prentice Hall, Inc.
All rights reserved.
Outline
19
fig07_05.cpp
(2 of 3)
22 private:
23 int count;
24 const int increment; // const data member
25
26 }; // end class Increment
27
28 // constructor
29 Increment::Increment( int c, int i )
30 { // Constant member 'increment' is not initialized
31 count = c; // allowed because count is not constant
32 increment = i; // ERROR: Cannot modify a const object
33
34 } // end Increment constructor
35
36 // print count and increment values
37 void Increment::print() const
38 {
39 cout << "count = " << count
40 << ", increment = " << increment << endl;
41
42 } // end function print
43
Declare increment as const
data member.
Attempting to modify const
data member increment
results in error.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
20
fig07_05.cpp
(3 of 3)
fig07_05.cpp
output (1 of 1)
44 int main()
45 {
46 Increment value( 10, 5 );
47
48 cout << "Before incrementing: ";
49 value.print();
50
51 for ( int j = 0; j < 3; j++ ) {
52 value.addIncrement();
53 cout << "After increment " << j + 1 << ": ";
54 value.print();
55 }
56
57 return 0;
58
59 } // end main
D:\cpphtp4_examples\ch07\Fig07_03\Fig07_03.cpp(30) : error C2758:
'increment' : must be initialized in constructor base/member
initializer list
D:\cpphtp4_examples\ch07\Fig07_03\Fig07_03.cpp(24) :
see declaration of 'increment'
D:\cpphtp4_examples\ch07\Fig07_03\Fig07_03.cpp(32) : error C2166:
l-value specifies const object
Not using member initializer
syntax to initialize const
data member increment
results in error.
Attempting to modify const
data member increment
results in error.
2003 Prentice Hall, Inc. All rights reserved.
21
7.3
Composition: Objects as Members of
Classes
• Composition
– Class has objects of other classes as members
• Construction of objects
– Member objects constructed in order declared
• Not in order of constructor’s member initializer list
• Constructed before enclosing class objects (host objects)
2003 Prentice Hall, Inc.
All rights reserved.
Outline
22
date1.h (1 of 1)
1 // Fig. 7.6: date1.h
2 // Date class definition.
3 // Member functions defined in date1.cpp
4 #ifndef DATE1_H
5 #define DATE1_H
6
7 class Date {
8
9 public:
10 Date( int = 1, int = 1, int = 1900 ); // default constructor
11 void print() const; // print date in month/day/year format
12 ~Date(); // provided to confirm destruction order
13
14 private:
15 int month; // 1-12 (January-December)
16 int day; // 1-31 based on month
17 int year; // any year
18
19 // utility function to test proper day for month and year
20 int checkDay( int ) const;
21
22 }; // end class Date
23
24 #endif
Note no constructor with
parameter of type Date.
Recall compiler provides
default copy constructor.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
23
date1.cpp (1 of 3)
1 // Fig. 7.7: date1.cpp
2 // Member-function definitions for class Date.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 // include Date class definition from date1.h
9 #include "date1.h"
10
11 // constructor confirms proper value for month; calls
12 // utility function checkDay to confirm proper value for day
13 Date::Date( int mn, int dy, int yr )
14 {
15 if ( mn > 0 && mn <= 12 ) // validate the month
16 month = mn;
17
18 else { // invalid month set to 1
19 month = 1;
20 cout << "Month " << mn << " invalid. Set to month 1.\n";
21 }
22
23 year = yr; // should validate yr
24 day = checkDay( dy ); // validate the day
25
2003 Prentice Hall, Inc.
All rights reserved.
Outline
24
date1.cpp (2 of 3)
26 // output Date object to show when its constructor is called
27 cout << "Date object constructor for date ";
28 print();
29 cout << endl;
30
31 } // end Date constructor
32
33 // print Date object in form month/day/year
34 void Date::print() const
35 {
36 cout << month << '/' << day << '/' << year;
37
38 } // end function print
39
40 // output Date object to show when its destructor is called
41 Date::~Date()
42 {
43 cout << "Date object destructor for date ";
44 print();
45 cout << endl;
46
47 } // end destructor ~Date
48
Output to show timing of
constructors.
No arguments; each member
function contains implicit
handle to object on which it
operates.
Output to show timing of
destructors.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
25
date1.cpp (3 of 3)
49 // utility function to confirm proper day value based on
50 // month and year; handles leap years, too
51 int Date::checkDay( int testDay ) const
52 {
53 static const int daysPerMonth[ 13 ] =
54 { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
55
56 // determine whether testDay is valid for specified month
57 if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
58 return testDay;
59
60 // February 29 check for leap year
61 if ( month == 2 && testDay == 29 &&
62 ( year % 400 == 0 ||
63 ( year % 4 == 0 && year % 100 != 0 ) ) )
64 return testDay;
65
66 cout << "Day " << testDay << " invalid. Set to day 1.\n";
67
68 return 1; // leave object in consistent state if bad value
69
70 } // end function checkDay
2003 Prentice Hall, Inc.
All rights reserved.
Outline
26
employee1.h (1 of 2)
1 // Fig. 7.8: employee1.h
2 // Employee class definition.
3 // Member functions defined in employee1.cpp.
4 #ifndef EMPLOYEE1_H
5 #define EMPLOYEE1_H
6
7 // include Date class definition from date1.h
8 #include "date1.h"
9
10 class Employee {
11
12 public:
13 Employee(
14 const char *, const char *, const Date &, const Date & );
15
16 void print() const;
17 ~Employee(); // provided to confirm destruction order
18
19 private:
20 char firstName[ 25 ];
21 char lastName[ 25 ];
22 const Date birthDate; // composition: member object
23 const Date hireDate; // composition: member object
24
25 }; // end class Employee
Using composition;
Employee object contains
Date objects as data
members.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
27
employee1.h (2 of 2)
employee1.cpp
(1 of 3)
26
27 #endif
1 // Fig. 7.9: employee1.cpp
2 // Member-function definitions for class Employee.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 #include <cstring> // strcpy and strlen prototypes
9
10 #include "employee1.h" // Employee class definition
11 #include "date1.h" // Date class definition
12
2003 Prentice Hall, Inc.
All rights reserved.
Outline
28
employee1.cpp
(2 of 3)
13 // constructor uses member initializer list to pass initializer
14 // values to constructors of member objects birthDate and
15 // hireDate [Note: This invokes the so-called "default copy
16 // constructor" which the C++ compiler provides implicitly.]
17 Employee::Employee( const char *first, const char *last,
18 const Date &dateOfBirth, const Date &dateOfHire )
19 : birthDate( dateOfBirth ), // initialize birthDate
20 hireDate( dateOfHire ) // initialize hireDate
21 {
22 // copy first into firstName and be sure that it fits
23 int length = strlen( first );
24 length = ( length < 25 ? length : 24 );
25 strncpy( firstName, first, length );
26 firstName[ length ] = '\0';
27
28 // copy last into lastName and be sure that it fits
29 length = strlen( last );
30 length = ( length < 25 ? length : 24 );
31 strncpy( lastName, last, length );
32 lastName[ length ] = '\0';
33
34 // output Employee object to show when constructor is called
35 cout << "Employee object constructor: "
36 << firstName << ' ' << lastName << endl;
37
Member initializer syntax to
initialize Date data members
birthDate and
hireDate; compiler uses
default copy constructor.
Output to show timing of
constructors.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
29
employee1.cpp
(3 of 3)
38 } // end Employee constructor
39
40 // print Employee object
41 void Employee::print() const
42 {
43 cout << lastName << ", " << firstName << "\nHired: ";
44 hireDate.print();
45 cout << " Birth date: ";
46 birthDate.print();
47 cout << endl;
48
49 } // end function print
50
51 // output Employee object to show when its destructor is called
52 Employee::~Employee()
53 {
54 cout << "Employee object destructor: "
55 << lastName << ", " << firstName << endl;
56
57 } // end destructor ~Employee
Output to show timing of
destructors.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
30
fig07_10.cpp
(1 of 1)
1 // Fig. 7.10: fig07_10.cpp
2 // Demonstrating composition--an object with member objects.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 #include "employee1.h" // Employee class definition
9
10 int main()
11 {
12 Date birth( 7, 24, 1949 );
13 Date hire( 3, 12, 1988 );
14 Employee manager( "Bob", "Jones", birth, hire );
15
16 cout << '\n';
17 manager.print();
18
19 cout << "\nTest Date constructor with invalid values:\n";
20 Date lastDayOff( 14, 35, 1994 ); // invalid month and day
21 cout << endl;
22
23 return 0;
24
25 } // end main
Create Date objects to pass
to Employee constructor.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
31
fig07_10.cpp
output (1 of 1)
Date object constructor for date 7/24/1949
Date object constructor for date 3/12/1988
Employee object constructor: Bob Jones
Jones, Bob
Hired: 3/12/1988 Birth date: 7/24/1949
Test Date constructor with invalid values:
Month 14 invalid. Set to month 1.
Day 35 invalid. Set to day 1.
Date object constructor for date 1/1/1994
Date object destructor for date 1/1/1994
Employee object destructor: Jones, Bob
Date object destructor for date 3/12/1988
Date object destructor for date 7/24/1949
Date object destructor for date 3/12/1988
Date object destructor for date 7/24/1949
Note two additional Date
objects constructed; no output
since default copy constructor
used.
Destructor for host object
manager runs before
destructors for member
objects hireDate and
birthDate.
Destructor for Employee’s
member object hireDate.
Destructor for Employee‘s
member object birthDate.
Destructor for Date object
hire.
Destructor for Date object
birth.
2003 Prentice Hall, Inc. All rights reserved.
32
7.4 friend Functions and friend Classes
• friend function
– Defined outside class’s scope
– Right to access non-public members
• Declaring friends
– Function
• Precede function prototype with keyword friend
– All member functions of class ClassTwo as friends of
class ClassOne
• Place declaration of form
friend class ClassTwo;
in ClassOne definition
2003 Prentice Hall, Inc. All rights reserved.
33
7.4 friend Functions and friend Classes
• Properties of friendship
– Friendship granted, not taken
• Class B friend of class A
– Class A must explicitly declare class B friend
– Not symmetric
• Class B friend of class A
• Class A not necessarily friend of class B
– Not transitive
• Class A friend of class B
• Class B friend of class C
• Class A not necessarily friend of Class C
2003 Prentice Hall, Inc.
All rights reserved.
Outline
34
fig07_11.cpp
(1 of 3)
1 // Fig. 7.11: fig07_11.cpp
2 // Friends can access private members of a class.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 // Count class definition
9 class Count {
10 friend void setX( Count &, int ); // friend declaration
11
12 public:
13
14 // constructor
15 Count()
16 : x( 0 ) // initialize x to 0
17 {
18 // empty body
19
20 } // end Count constructor
21
Precede function prototype
with keyword friend.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
35
fig07_11.cpp
(2 of 3)
22 // output x
23 void print() const
24 {
25 cout << x << endl;
26
27 } // end function print
28
29 private:
30 int x; // data member
31
32 }; // end class Count
33
34 // function setX can modify private data of Count
35 // because setX is declared as a friend of Count
36 void setX( Count &c, int val )
37 {
38 c.x = val; // legal: setX is a friend of Count
39
40 } // end function setX
41
Pass Count object since C-
style, standalone function.
Since setX friend of
Count, can access and
modify private data
member x.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
36
fig07_11.cpp
(3 of 3)
fig07_11.cpp
output (1 of 1)
42 int main()
43 {
44 Count counter; // create Count object
45
46 cout << "counter.x after instantiation: ";
47 counter.print();
48
49 setX( counter, 8 ); // set x with a friend
50
51 cout << "counter.x after call to setX friend function: ";
52 counter.print();
53
54 return 0;
55
56 } // end main
counter.x after instantiation: 0
counter.x after call to setX friend function: 8
Use friend function to
access and modify private
data member x.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
37
fig07_12.cpp
(1 of 3)
1 // Fig. 7.12: fig07_12.cpp
2 // Non-friend/non-member functions cannot access
3 // private data of a class.
4 #include <iostream>
5
6 using std::cout;
7 using std::endl;
8
9 // Count class definition
10 // (note that there is no friendship declaration)
11 class Count {
12
13 public:
14
15 // constructor
16 Count()
17 : x( 0 ) // initialize x to 0
18 {
19 // empty body
20
21 } // end Count constructor
22
2003 Prentice Hall, Inc.
All rights reserved.
Outline
38
fig07_12.cpp
(2 of 3)
23 // output x
24 void print() const
25 {
26 cout << x << endl;
27
28 } // end function print
29
30 private:
31 int x; // data member
32
33 }; // end class Count
34
35 // function tries to modify private data of Count,
36 // but cannot because function is not a friend of Count
37 void cannotSetX( Count &c, int val )
38 {
39 c.x = val; // ERROR: cannot access private member in Count
40
41 } // end function cannotSetX
42
Attempting to modify
private data member from
non-friend function results
in error.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
39
fig07_12.cpp
(3 of 3)
fig07_12.cpp
output (1 of 1)
43 int main()
44 {
45 Count counter; // create Count object
46
47 cannotSetX( counter, 3 ); // cannotSetX is not a friend
48
49 return 0;
50
51 } // end main
D:\cpphtp4_examples\ch07\Fig07_12\Fig07_12.cpp(39) : error C2248:
'x' : cannot access private member declared in class 'Count'
D:\cpphtp4_examples\ch07\Fig07_12\Fig07_12.cpp(31) :
see declaration of 'x'
Attempting to modify
private data member from
non-friend function results
in error.
2003 Prentice Hall, Inc. All rights reserved.
40
7.5
Using the this Pointer
• this pointer
– Allows object to access own address
– Not part of object itself
• Implicit argument to non-static member function call
– Implicitly reference member data and functions
– Type of this pointer depends on
• Type of object
• Whether member function is const
• In non-const member function of Employee
– this has type Employee * const
• Constant pointer to non-constant Employee object
• In const member function of Employee
– this has type const Employee * const
• Constant pointer to constant Employee object
2003 Prentice Hall, Inc.
All rights reserved.
Outline
41
fig07_13.cpp
(1 of 3)
1 // Fig. 7.13: fig07_13.cpp
2 // Using the this pointer to refer to object members.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 class Test {
9
10 public:
11 Test( int = 0 ); // default constructor
12 void print() const;
13
14 private:
15 int x;
16
17 }; // end class Test
18
19 // constructor
20 Test::Test( int value )
21 : x( value ) // initialize x to value
22 {
23 // empty body
24
25 } // end Test constructor
2003 Prentice Hall, Inc.
All rights reserved.
Outline
42
fig07_13.cpp
(2 of 3)
26
27 // print x using implicit and explicit this pointers;
28 // parentheses around *this required
29 void Test::print() const
30 {
31 // implicitly use this pointer to access member x
32 cout << " x = " << x;
33
34 // explicitly use this pointer to access member x
35 cout << "\n this->x = " << this->x;
36
37 // explicitly use dereferenced this pointer and
38 // the dot operator to access member x
39 cout << "\n(*this).x = " << ( *this ).x << endl;
40
41 } // end function print
42
43 int main()
44 {
45 Test testObject( 12 );
46
47 testObject.print();
48
49 return 0;
50
Implicitly use this pointer;
only specify name of data
member (x).
Explicitly use this pointer
with arrow operator.
Explicitly use this pointer;
dereference this pointer
first, then use dot operator.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
43
fig07_13.cpp
(3 of 3)
fig07_13.cpp
output (1 of 1)
51 } // end main
x = 12
this->x = 12
(*this).x = 12
2003 Prentice Hall, Inc. All rights reserved.
44
7.5
Using the this Pointer
• Cascaded member function calls
– Multiple functions invoked in same statement
– Function returns reference pointer to same object
{ return *this; }
– Other functions operate on that pointer
– Functions that do not return references must be called last
2003 Prentice Hall, Inc.
All rights reserved.
Outline
45
time6.h (1 of 2)
1 // Fig. 7.14: time6.h
2 // Cascading member function calls.
3
4 // Time class definition.
5 // Member functions defined in time6.cpp.
6 #ifndef TIME6_H
7 #define TIME6_H
8
9 class Time {
10
11 public:
12 Time( int = 0, int = 0, int = 0 ); // default constructor
13
14 // set functions
15 Time &setTime( int, int, int ); // set hour, minute, second
16 Time &setHour( int ); // set hour
17 Time &setMinute( int ); // set minute
18 Time &setSecond( int ); // set second
19
20 // get functions (normally declared const)
21 int getHour() const; // return hour
22 int getMinute() const; // return minute
23 int getSecond() const; // return second
24
Set functions return reference
to Time object to enable
cascaded member function
calls.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
46
time6.h (2 of 2)
25 // print functions (normally declared const)
26 void printUniversal() const; // print universal time
27 void printStandard() const; // print standard time
28
29 private:
30 int hour; // 0 - 23 (24-hour clock format)
31 int minute; // 0 - 59
32 int second; // 0 - 59
33
34 }; // end class Time
35
36 #endif
2003 Prentice Hall, Inc.
All rights reserved.
Outline
47
time6.cpp (1 of 5)
1 // Fig. 7.15: time6.cpp
2 // Member-function definitions for Time class.
3 #include <iostream>
4
5 using std::cout;
6
7 #include <iomanip>
8
9 using std::setfill;
10 using std::setw;
11
12 #include "time6.h" // Time class definition
13
14 // constructor function to initialize private data;
15 // calls member function setTime to set variables;
16 // default values are 0 (see class definition)
17 Time::Time( int hr, int min, int sec )
18 {
19 setTime( hr, min, sec );
20
21 } // end Time constructor
22
2003 Prentice Hall, Inc.
All rights reserved.
Outline
48
time6.cpp (2 of 5)
23 // set values of hour, minute, and second
24 Time &Time::setTime( int h, int m, int s )
25 {
26 setHour( h );
27 setMinute( m );
28 setSecond( s );
29
30 return *this; // enables cascading
31
32 } // end function setTime
33
34 // set hour value
35 Time &Time::setHour( int h )
36 {
37 hour = ( h >= 0 && h < 24 ) ? h : 0;
38
39 return *this; // enables cascading
40
41 } // end function setHour
42
Return *this as reference to
enable cascaded member
function calls.
Return *this as reference to
enable cascaded member
function calls.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
49
time6.cpp (3 of 5)
43 // set minute value
44 Time &Time::setMinute( int m )
45 {
46 minute = ( m >= 0 && m < 60 ) ? m : 0;
47
48 return *this; // enables cascading
49
50 } // end function setMinute
51
52 // set second value
53 Time &Time::setSecond( int s )
54 {
55 second = ( s >= 0 && s < 60 ) ? s : 0;
56
57 return *this; // enables cascading
58
59 } // end function setSecond
60
61 // get hour value
62 int Time::getHour() const
63 {
64 return hour;
65
66 } // end function getHour
67
Return *this as reference to
enable cascaded member
function calls.
Return *this as reference to
enable cascaded member
function calls.
2003 Prentice Hall, Inc.
All rights reserved.
Outline
50
time6.cpp (4 of 5)
68 // get minute value
69 int Time::getMinute() const
70 {
71 return minute;
72
73 } // end function getMinute
74
75 // get second value
76 int Time::getSecond() const
77 {
78 return second;
79
80 } // end function getSecond
81
82 // print Time in universal format
83 void Time::printUniversal() const
84 {
85 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
86 << setw( 2 ) << minute << ":"
87 << setw( 2 ) << second;
88
89 } // end function printUniversal
90
2003 Prentice Hall, Inc.
All rights reserved.
Outline
51
time6.cpp (5 of 5)
91 // print Time in standard format
92 void Time::printStandard() const
93 {
94 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour %