0% found this document useful (0 votes)
48 views87 pages

2003 Prentice Hall, Inc. All Rights Reserved

This document discusses implementing a user-defined Time data type using a struct in C++. It defines a Time struct with hour, minute, and second integer members. A main() function initializes a Time variable, sets its member values, and passes it by reference to functions to print the time in universal and standard formats. Direct member access allows invalid member values to be assigned, demonstrating a limitation of this struct implementation.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
48 views87 pages

2003 Prentice Hall, Inc. All Rights Reserved

This document discusses implementing a user-defined Time data type using a struct in C++. It defines a Time struct with hour, minute, and second integer members. A main() function initializes a Time variable, sets its member values, and passes it by reference to functions to print the time in universal and standard formats. Direct member access allows invalid member values to be assigned, demonstrating a limitation of this struct implementation.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 87

1

Chapter 6: Classes and


Data Abstraction
Outline
6.1 Introduction
6.2 Structure Definitions
6.3 Accessing Structure Members
6.4 Implementing a User-Defined Type Time with a struct
6.5 Implementing a Time Abstract Data Type with a class
6.6 Class Scope and Accessing Class Members
6.7 Separating Interface from Implementation
6.8 Controlling Access to Members
6.9 Access Functions and Utility Functions
6.10 Initializing Class Objects: Constructors
6.11 Using Default Arguments with Constructors
6.12 Destructors
6.13 When Constructors and Destructors Are Called
6.14 Using Set and Get Functions
6.15 Subtle Trap: Returning a Reference to a
private Data Member
6.16 Default Memberwise Assignment
6.17 Software Reusability
 2003 Prentice Hall, Inc. All rights reserved.
2

6.1 Introduction

• Object-oriented programming (OOP)


– Encapsulates data (attributes) and functions (behavior) into
packages called classes
• Information hiding
– Class objects communicate across well-defined interfaces
– Implementation details hidden within classes themselves
• User-defined (programmer-defined) types: classes
– Data (data members)
– Functions (member functions or methods)
– Similar to blueprints – reusable
– Class instance: object

 2003 Prentice Hall, Inc. All rights reserved.


3

6.2 Structure Definitions

• Structures
– Aggregate data types built using elements of other types

struct Time { Structure tag


int hour;
int minute; Structure members
int second;
};
• Structure member naming
– In same struct: must have unique names
– In different structs: can share name
• struct definition must end with semicolon

 2003 Prentice Hall, Inc. All rights reserved.


4

6.2 Structure Definitions

• Self-referential structure
– Structure member cannot be instance of enclosing struct
– Structure member can be pointer to instance of enclosing
struct (self-referential structure)
• Used for linked lists, queues, stacks and trees
• struct definition
– Creates new data type used to declare variables
– Structure variables declared like variables of other types
– Examples:
• Time timeObject;
• Time timeArray[ 10 ];
• Time *timePtr;
• Time &timeRef = timeObject;

 2003 Prentice Hall, Inc. All rights reserved.


5

6.3 Accessing Structure Members

• Member access operators


– Dot operator (.) for structure and class members
– Arrow operator (->) for structure and class members via
pointer to object
– Print member hour of timeObject:
cout << timeObject.hour;
OR
timePtr = &timeObject;
cout << timePtr->hour;
– timePtr->hour same as ( *timePtr ).hour
• Parentheses required
– * lower precedence than .

 2003 Prentice Hall, Inc. All rights reserved.


6
6.4 Implementing a User-Defined Type Time
with a struct
• Default: structures passed by value
– Pass structure by reference
• Avoid overhead of copying structure
• C-style structures
– No “interface”
• If implementation changes, all programs using that struct
must change accordingly
– Cannot print as unit
• Must print/format member by member
– Cannot compare in entirety
• Must compare member by member

 2003 Prentice Hall, Inc. All rights reserved.


7
1 // Fig. 6.1: fig06_01.cpp
2 // Create a structure, set its members, and print it.
Outline
3 #include <iostream>
4
fig06_01.cpp
5 using std::cout;
6 using std::endl;
(1 of 3)
7
8 #include <iomanip>
9
10 using std::setfill; Define structure type Time
11 using std::setw;
with three integer members.
12
13 // structure definition
14 struct Time {
15 int hour; // 0-23 (24-hour clock format)
16 int minute; // 0-59
17 int second; // 0-59
18 Pass references to constant
19 }; // end struct Time Time objects to eliminate
20 copying overhead.
21 void printUniversal( const Time & ); // prototype
22 void printStandard( const Time & ); // prototype
23

 2003 Prentice Hall, Inc.


All rights reserved.
8
24 int main()
25 { Use dot operator to initialize
Outline
26 Time dinnerTime; // structure
variablemembers.
of new type Time
27
fig06_01.cpp
28 dinnerTime.hour = 18; // set hour member of dinnerTime
29 dinnerTime.minute = 30; // set minute member of dinnerTime
(2 of 3)
30 dinnerTime.second = 0; // set second member of dinnerTime
31
32 cout << "Dinner will be held at ";
33 printUniversal( dinnerTime );
34 cout << " universal time,\nwhich is ";
35 printStandard( dinnerTime );
Direct access to data allows
36 cout << " standard time.\n";
37
assignment of bad values.
38 dinnerTime.hour = 29; // set hour to invalid value
39 dinnerTime.minute = 73; // set minute to invalid value
40
41 cout << "\nTime with invalid values: ";
42 printUniversal( dinnerTime );
43 cout << endl;
44
45 return 0;
46
47 } // end main
48

 2003 Prentice Hall, Inc.


All rights reserved.
9
49 // print time in universal-time format
50 void printUniversal( const Time &t )
Outline
51 {
52 cout << setfill( '0' ) << setw( 2 ) << t.hour << ":"
fig06_01.cpp
53 << setw( 2 ) << t.minute << ":"
54 << setw( 2 ) << t.second;
(3 of 3)
55
56 } // end function printUniversal
Use parameterized stream
fig06_01.cpp
57
manipulator setfill.
output (1 of 1)
58 // print time in standard-time format
Use dot operator to access
59 void printStandard( const Time &t )
data members.
60 {
61 cout << ( ( t.hour == 0 || t.hour == 12 ) ?
62 12 : t.hour % 12 ) << ":" << setfill( '0' )
63 << setw( 2 ) << t.minute << ":"
64 << setw( 2 ) << t.second
65 << ( t.hour < 12 ? " AM" : " PM" );
66
67 } // end function printStandard

Dinner will be held at 18:30:00 universal time,


which is 6:30:00 PM standard time.

Time with invalid values: 29:73:00

 2003 Prentice Hall, Inc.


All rights reserved.
10
6.5 Implementing a Time Abstract Data Type
with a class
• Classes
– Model objects
• Attributes (data members)
• Behaviors (member functions)
– Defined using keyword class
– Member functions
• Methods
• Invoked in response to messages
• Member access specifiers
– public:
• Accessible wherever object of class in scope
– private:
• Accessible only to member functions of class
– protected:
 2003 Prentice Hall, Inc. All rights reserved.
11
6.5 Implementing a Time Abstract Data Type
with a class
• Constructor function
– Special member function
• Initializes data members
• Same name as class
– Called when object instantiated
– Several constructors
• Function overloading
– No return type

 2003 Prentice Hall, Inc. All rights reserved.


12
1 class Time {
2
Outline
3 public: Function prototypes for
4 Time(); Definition of class begins
Class//body startspublic
constructorwith leftmember functions.
with keyword class. Class Time
5 void setTime( int, int, int brace.
); // set hour, minute, second
6 void printUniversal(); Member // access specifiers.
print universal-time format
definition
7 void printStandard();
Constructor has same name as
// print standard-time format (1 of 1)
8 Time, anddata
class, private no return
members
9 private: type. accessible only to member
10 int hour; // 0 - 23 (24-hour clock format)
functions.
11 int minute; Class body
// Definition
0 - 59 ends
terminatesright
with with
12 int second; brace.
// 0 - 59
semicolon.
13
14 }; // end class Time

 2003 Prentice Hall, Inc.


All rights reserved.
13
6.5 Implementing a Time Abstract Data Type
with a class
• Objects of class
– After class definition
• Class name new type specifier
– C++ extensible language
• Object, array, pointer and reference declarations
– Example: Class name becomes new
type specifier.
Time sunset; // object of type Time
Time arrayOfTimes[ 5 ]; // array of Time objects
Time *pointerToTime; // pointer to a Time object
Time &dinnerTime = sunset; // reference to a Time object

 2003 Prentice Hall, Inc. All rights reserved.


14
6.5 Implementing a Time Abstract Data Type
with a class
• Member functions defined outside class
– Binary scope resolution operator (::)
• “Ties” member name to class name
• Uniquely identify functions of particular class
• Different classes can have member functions with same name
– Format for defining member functions
ReturnType ClassName::MemberFunctionName( ){

}
– Does not change whether function public or private
• Member functions defined inside class
– Do not need scope resolution operator, class name
– Compiler attempts inline
• Outside class, inline explicitly with keyword inline

 2003 Prentice Hall, Inc. All rights reserved.


15
1 // Fig. 6.3: fig06_03.cpp
2 // Time class.
Outline
3 #include <iostream>
4
fig06_03.cpp
5 using std::cout;
6 using std::endl;
(1 of 5)
7
8 #include <iomanip>
9
10 using std::setfill;
11 using std::setw; Define class Time.
12
13 // Time abstract data type (ADT) definition
14 class Time {
15
16 public:
17 Time(); // constructor
18 void setTime( int, int, int ); // set hour, minute, second
19 void printUniversal(); // print universal-time format
20 void printStandard(); // print standard-time format
21

 2003 Prentice Hall, Inc.


All rights reserved.
16
22 private:
23 int hour; // 0 - 23 (24-hour clock format)
Outline
24 int minute; // 0 - 59
25 int second; // 0 - 59
fig06_03.cpp
26
27 }; // end class Time
(2 of 5)
28
29 // Time constructor initializes each data member to zero and
30
Constructor initializes
// ensures all Time objects start in a consistent state
31 Time::Time() private data members
32 { to 0.
33 hour = minute = second = 0;
34
35 } // end Time constructor
36
37 // set new Time value using universal time, perform validity
38 // checks on the data values and set invalid values to zero public member
39 void Time::setTime( int h, int m, int s )
function checks
40 {
parameter values for
41 hour = ( h >= 0 && h < 24 ) ? h : 0;
42 minute = ( m >= 0 && m < 60 ) ? m : 0;
validity before setting
43 second = ( s >= 0 && s < 60 ) ? s : 0; private data
44 members.
45 } // end function setTime
46

 2003 Prentice Hall, Inc.


All rights reserved.
17
47 // print Time in universal format
48 void Time::printUniversal()
Outline
49 {
50 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
fig06_03.cpp
51 << setw( 2 ) << minute << ":"
52 << setw( 2 ) << second;
(3 of 5)
53
54 } // end function printUniversal No arguments (implicitly
55 “know” purpose is to print
56 // print Time in standard format data members); member
57 void Time::printStandard() function calls more concise.
58 {
59 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
60 << ":" << setfill( '0' ) << setw( 2 ) << minute
61 << ":" << setw( 2 ) << second
62 << ( hour < 12 ? " AM" : " PM" );
63
64 } // end function printStandard
Declare variable t to be
65
object of class Time.
66 int main()
67 {
68 Time t; // instantiate object t of class Time
69

 2003 Prentice Hall, Inc.


All rights reserved.
18
70 // output Time object t's initial values
71 cout << "The initial universal time is ";
Outline
72 t.printUniversal(); // 00:00:00
73
74
Invoke public member
cout << "\nThe initial standard time is ";
fig06_03.cpp
75 t.printStandard(); // 12:00:00 AM functions to print time. (4 of 5)
76
77 t.setTime( 13, 27, 6 ); // change time
78
79 Set data members
// output Time object t's new values using
80 cout << "\n\nUniversal time after public
setTime is ";
member function.
81 t.printUniversal(); // 13:27:06
82
Attempt to set data members
83 cout << "\nStandard time after setTime is ";
84 t.printStandard();
to invalid values
// 1:27:06 PM
using
85 public member function.
86 t.setTime( 99, 99, 99 ); // attempt invalid settings
87
88 // output t's values after specifying invalid values
89 cout << "\n\nAfter attempting invalid settings:"
90 << "\nUniversal time: ";
91 t.printUniversal(); // 00:00:00
92

 2003 Prentice Hall, Inc.


All rights reserved.
19
93 cout << "\nStandard time: ";
94 t.printStandard(); // 12:00:00 AM
Outline
95 cout << endl;
96
fig06_03.cpp
97 return 0;
98
(5 of 5)
99 } // end main
fig06_03.cpp
The initial universal time is 00:00:00 output (1 of 1)
The initial standard time is 12:00:00 AM

Universal time after setTime is 13:27:06


Standard time after setTime is 1:27:06 PM
Data members set to 0 after
After attempting invalid settings:
attempting invalid settings.
Universal time: 00:00:00
Standard time: 12:00:00 AM

 2003 Prentice Hall, Inc.


All rights reserved.
20
6.5 Implementing a Time Abstract Data Type
with a class
• Destructors
– Same name as class
• Preceded with tilde (~)
– No arguments
– Cannot be overloaded
– Performs “termination housekeeping”

 2003 Prentice Hall, Inc. All rights reserved.


21
6.5 Implementing a Time Abstract Data Type
with a class
• Advantages of using classes
– Simplify programming
– Interfaces
• Hide implementation
– Software reuse
• Composition (aggregation)
– Class objects included as members of other classes
• Inheritance
– New classes derived from old

 2003 Prentice Hall, Inc. All rights reserved.


22
6.6 Class Scope and Accessing Class
Members
• Class scope
– Data members, member functions
– Within class scope
• Class members
– Immediately accessible by all member functions
– Referenced by name
– Outside class scope
• Referenced through handles
– Object name, reference to object, pointer to object
• File scope
– Nonmember functions

 2003 Prentice Hall, Inc. All rights reserved.


23
6.6 Class Scope and Accessing Class
Members
• Function scope
– Variables declared in member function
– Only known to function
– Variables with same name as class-scope variables
• Class-scope variable “hidden”
– Access with scope resolution operator (::)
ClassName::classVariableName
– Variables only known to function they are defined in
– Variables are destroyed after function completion

 2003 Prentice Hall, Inc. All rights reserved.


24
6.6 Class Scope and Accessing Class
Members
• Operators to access class members
– Identical to those for structs
– Dot member selection operator (.)
• Object
• Reference to object
– Arrow member selection operator (->)
• Pointers

 2003 Prentice Hall, Inc. All rights reserved.


25
1 // Fig. 6.4: fig06_04.cpp
2 // Demonstrating the class member access operators . and ->
Outline
3 //
4 // CAUTION: IN FUTURE EXAMPLES WE AVOID PUBLIC DATA!
fig06_04.cpp
5 #include <iostream>
6
(1 of 2)
7 using std::cout;
8 using std::endl;
9
10 // class Count definition
11 class Count { Data member x public to
12 illustrate class member access
13 public: operators; typically data
14 int x; members private.
15
16 void print()
17 {
18 cout << x << endl;
19 }
20
21 }; // end class Count
22

 2003 Prentice Hall, Inc.


All rights reserved.
26
23 int main()
24 {
Outline
25 Count counter; // create counter object
26 Count *counterPtr = &counter; // create pointer to counter
fig06_04.cpp
27 Count &counterRef = counter; // Use
create reference
dot member to counter
selection (2 of 2)
28 operator for counter object.
29 cout << "Assign 1 to x and print using the object's name: ";
30 counter.x = 1; // assign 1 to data member x fig06_04.cpp
31 counter.print(); // call memberUse dot member
function printselection output (1 of 1)
32 operator for counterRef
33 cout << "Assign 2 to x and print using a reference:
reference to object. ";
34 counterRef.x = 2; // assign 2 to data member x
35 counterRef.print(); // call member Use arrow print
function member selection
36 operator for counterPtr
37 cout << "Assign 3 to x and print pointer
using to object.";
a pointer:
38 counterPtr->x = 3; // assign 3 to data member x
39 counterPtr->print(); // call member function print
40
41 return 0;
42
43 } // end main

Assign 1 to x and print using the object's name: 1


Assign 2 to x and print using a reference: 2
Assign 3 to x and print using a pointer: 3

 2003 Prentice Hall, Inc.


All rights reserved.
27
6.7 Separating Interface from
Implementation
• Separating interface from implementation
– Advantage
• Easier to modify programs
– Disadvantage
• Header files
– Portions of implementation
• Inline member functions
– Hints about other implementation
• private members
• Can hide more with proxy class

 2003 Prentice Hall, Inc. All rights reserved.


28
6.7 Separating Interface from
Implementation
• Header files
– Class definitions and function prototypes
– Included in each file using class
• #include
– File extension .h
• Source-code files
– Member function definitions
– Same base name
• Convention
– Compiled and linked

 2003 Prentice Hall, Inc. All rights reserved.


29
1 // Fig. 6.5: time1.h
2 // Declaration of class Time.
Outline
3 // Member functions are defined in time1.cpp
Preprocessor code to prevent
4 multiple inclusions. time1.h (1 of 1)
5 // prevent multiple inclusions of header file
6 #ifndef TIME1_H
7 #define TIME1_H
8 Code between these directives
9 // Time abstract data type
“If not definition
defined”Preprocessor directivedefines
not included if name
10 class Time { Naming convention:
name TIME1_H.
TIME1_H already defined.
11 header file name with
12 public: underscore replacing period.
13 Time(); // constructor
14 void setTime( int, int, int ); // set hour, minute, second
15 void printUniversal(); // print universal-time format
16 void printStandard(); // print standard-time format
17
18 private:
19 int hour; // 0 - 23 (24-hour clock format)
20 int minute; // 0 - 59
21 int second; // 0 - 59
22
23 }; // end class Time
24
25 #endif

 2003 Prentice Hall, Inc.


All rights reserved.
30
1 // Fig. 6.6: time1.cpp
2 // Member-function definitions for class Time.
Outline
3 #include <iostream>
4
time1.cpp (1 of 3)
5 using std::cout;
6
7 #include <iomanip>
8
9 using std::setfill;
10 using std::setw; Include header file
11 time1.h.
12 // include definition of class Time from time1.h
13 #include "time1.h"
14
15 // Time constructor initializes each data member to zero.
16 // Ensures all Time objects Name
start of
inheader
a consistent state.
file enclosed
17 Time::Time() in quotes; angle brackets
18 { cause preprocessor to assume
19 hour = minute = second = 0;
header part of C++ Standard
20
Library.
21 } // end Time constructor
22

 2003 Prentice Hall, Inc.


All rights reserved.
31
23 // Set new Time value using universal time. Perform validity
24 // checks on the data values. Set invalid values to zero.
Outline
25 void Time::setTime( int h, int m, int s )
26 {
time1.cpp (2 of 3)
27 hour = ( h >= 0 && h < 24 ) ? h : 0;
28 minute = ( m >= 0 && m < 60 ) ? m : 0;
29 second = ( s >= 0 && s < 60 ) ? s : 0;
30
31 } // end function setTime
32
33 // print Time in universal format
34 void Time::printUniversal()
35 {
36 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
37 << setw( 2 ) << minute << ":"
38 << setw( 2 ) << second;
39
40 } // end function printUniversal
41

 2003 Prentice Hall, Inc.


All rights reserved.
32
42 // print Time in standard format
43 void Time::printStandard()
Outline
44 {
45 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
time1.cpp (3 of 3)
46 << ":" << setfill( '0' ) << setw( 2 ) << minute
47 << ":" << setw( 2 ) << second
48 << ( hour < 12 ? " AM" : " PM" );
49
50 } // end function printStandard

 2003 Prentice Hall, Inc.


All rights reserved.
33
1 // Fig. 6.7: fig06_07.cpp
2 // Program to test class Time.
Outline
3 // NOTE: This file must be compiled with time1.cpp.
4 #include <iostream>
fig06_07.cpp
5
6 using std::cout;
(1 of 2)
7 using std::endl; Include header file time1.h
8 to ensure correct
9 // include definition of class Time from time1.h
creation/manipulation and
10 #include "time1.h" determine size of Time class
11 object.
12 int main()
13 {
14 Time t; // instantiate object t of class Time
15
16 // output Time object t's initial values
17 cout << "The initial universal time is ";
18 t.printUniversal(); // 00:00:00
19 cout << "\nThe initial standard time is ";
20 t.printStandard(); // 12:00:00 AM
21
22 t.setTime( 13, 27, 6 ); // change time
23

 2003 Prentice Hall, Inc.


All rights reserved.
34
24 // output Time object t's new values
25 cout << "\n\nUniversal time after setTime is ";
Outline
26 t.printUniversal(); // 13:27:06
27 cout << "\nStandard time after setTime is ";
fig06_07.cpp
28 t.printStandard(); // 1:27:06 PM
29
(2 of 2)
30 t.setTime( 99, 99, 99 ); // attempt invalid settings
31 fig06_07.cpp
32 // output t's values after specifying invalid values output (1 of 1)
33 cout << "\n\nAfter attempting invalid settings:"
34 << "\nUniversal time: ";
35 t.printUniversal(); // 00:00:00
36 cout << "\nStandard time: ";
37 t.printStandard(); // 12:00:00 AM
38 cout << endl;
39
40 return 0;
41
42 } // end main

The initial universal time is 00:00:00


The initial standard time is 12:00:00 AM

Universal time after setTime is 13:27:06


Standard time after setTime is 1:27:06 PM

 2003 Prentice Hall, Inc.


All rights reserved.
35

6.8 Controlling Access to Members

• Access modes
– private
• Default access mode
• Accessible to member functions and friends
– public
• Accessible to any function in program with handle to class
object
– protected
• Chapter 9

 2003 Prentice Hall, Inc. All rights reserved.


36
1 // Fig. 6.8: fig06_08.cpp
2 // Demonstrate errors resulting from attempts
Outline
3 // to access private class members.
4 #include <iostream>
fig06_08.cpp
5
6 using std::cout;
(1 of 1)
7
8 // include definition of class Time from time1.h
9 #include "time1.h"
10
11 int main()
12 {
13 Time t;
Recall data member hour is
// create Time object
14 private; attempts to access
15 private members results in
16 t.hour = 7; // error: 'Time::hour' Data member minute also
error. is not accessible
17 private; attempts to access
18 // error: 'Time::minute' is not accessible private members produces
19 cout << "minute = " << t.minute;
error.
20
21 return 0;
22
23 } // end main

 2003 Prentice Hall, Inc.


All rights reserved.
37
D:\cpphtp4_examples\ch06\Fig6_06\Fig06_06.cpp(16) : error C2248:
'hour' : cannot access private member declared in class 'Time' Outline
D:\cpphtp4_examples\ch06\Fig6_06\Fig06_06.cpp(19) : error C2248:
'minute' : cannot access private member declared in class 'Time'
fig06_08.cpp
output (1 of 1)
Errors produced by
attempting to access
private members.

 2003 Prentice Hall, Inc.


All rights reserved.
38

6.8 Controlling Access to Members

• Class member access


– Default private
– Explicitly set to private, public, protected
• struct member access
– Default public
– Explicitly set to private, public, protected
• Access to class’s private data
– Controlled with access functions (accessor methods)
• Get function
– Read private data
• Set function
– Modify private data

 2003 Prentice Hall, Inc. All rights reserved.


39

6.9 Access Functions and Utility Functions

• Access functions
– public
– Read/display data
– Predicate functions
• Check conditions
• Utility functions (helper functions)
– private
– Support operation of public member functions
– Not intended for direct client use

 2003 Prentice Hall, Inc. All rights reserved.


40
1 // Fig. 6.9: salesp.h
2 // SalesPerson class definition.
Outline
3 // Member functions defined in salesp.cpp.
4 #ifndef SALESP_H
salesp.h (1 of 1)
5 #define SALESP_H
6
7 class SalesPerson {
8 Set access function
9 public: performs validity
10 SalesPerson(); // constructor
checks.
11 void getSalesFromUser(); // input sales from keyboard
12 void setSales( int, double ); // set sales for a month
13 void printAnnualSales();
private utility
// summarize and print sales
14 function.
15 private:
16 double totalAnnualSales(); // utility function
17 double sales[ 12 ]; // 12 monthly sales figures
18
19 }; // end class SalesPerson
20
21 #endif

 2003 Prentice Hall, Inc.


All rights reserved.
41
1 // Fig. 6.10: salesp.cpp
2 // Member functions for class SalesPerson.
Outline
3 #include <iostream>
4
salesp.cpp (1 of 3)
5 using std::cout;
6 using std::cin;
7 using std::endl;
8 using std::fixed;
9
10 #include <iomanip>
11
12 using std::setprecision;
13
14 // include SalesPerson class definition from salesp.h
15 #include "salesp.h"
16
17 // initialize elements of array sales to 0.0
18 SalesPerson::SalesPerson()
19 {
20 for ( int i = 0; i < 12; i++ )
21 sales[ i ] = 0.0;
22
23 } // end SalesPerson constructor
24

 2003 Prentice Hall, Inc.


All rights reserved.
42
25 // get 12 sales figures from the user at the keyboard
26 void SalesPerson::getSalesFromUser()
Outline
27 {
28 double salesFigure;
salesp.cpp (2 of 3)
29
30 for ( int i = 1; i <= 12; i++ ) {
31 cout << "Enter sales amount for month " << i << ": ";
32 cin >> salesFigure;
33 setSales( i, salesFigure );
34
35 } // end for
36
37 } // end function getSalesFromUser
38
39 // set one of the 12 monthly sales figures; function subtracts
40 // one from month value for proper subscript in sales array
Set access function performs
41 void SalesPerson::setSales( int month, double amount )
42 {
validity checks.
43 // test for valid month and amount values
44 if ( month >= 1 && month <= 12 && amount > 0 )
45 sales[ month - 1 ] = amount; // adjust for subscripts 0-11
46
47 else // invalid month or amount value
48 cout << "Invalid month or sales figure" << endl;

 2003 Prentice Hall, Inc.


All rights reserved.
43
49
50 } // end function setSales
Outline
51
52 // print total annual sales (with help of utility function)
salesp.cpp (3 of 3)
53 void SalesPerson::printAnnualSales()
54 {
55 cout << setprecision( 2 ) << fixed
56 << "\nThe total annual sales are: $"
57 << totalAnnualSales() << endl; // call utility function
58
59 } // end function printAnnualSales
60 private utility function to
61 // private utility function to total annual sales help function
62 double SalesPerson::totalAnnualSales() printAnnualSales;
63 { encapsulates logic of
64 double total = 0.0; // initialize total manipulating sales array.
65
66 for ( int i = 0; i < 12; i++ ) // summarize sales results
67 total += sales[ i ];
68
69 return total;
70
71 } // end function totalAnnualSales

 2003 Prentice Hall, Inc.


All rights reserved.
44
1 // Fig. 6.11: fig06_11.cpp
2 // Demonstrating a utility function.
Outline
3 // Compile this program with salesp.cpp
4
fig06_11.cpp
5 // include SalesPerson class definition from salesp.h
6 #include "salesp.h"
(1 of 1)
7
8 int main() Simple sequence of member
9 {
function calls; logic
10 SalesPerson s; // create SalesPerson object s
encapsulated in member
11
12 s.getSalesFromUser(); //
functions.
note simple sequential code; no
13 s.printAnnualSales(); // control structures in main
14
15 return 0;
16
17 } // end main

 2003 Prentice Hall, Inc.


All rights reserved.
45
Enter sales amount for month 1: 5314.76
Enter sales amount for month 2: 4292.38
Outline
Enter sales amount for month 3: 4589.83
Enter sales amount for month 4: 5534.03
fig06_11.cpp
Enter sales amount for month 5: 4376.34
Enter sales amount for month 6: 5698.45
output (1 of 1)
Enter sales amount for month 7: 4439.22
Enter sales amount for month 8: 5893.57
Enter sales amount for month 9: 4909.67
Enter sales amount for month 10: 5123.45
Enter sales amount for month 11: 4024.97
Enter sales amount for month 12: 5923.92

The total annual sales are: $60120.59

 2003 Prentice Hall, Inc.


All rights reserved.
46

6.10 Initializing Class Objects: Constructors

• Constructors
– Initialize data members
• Or can set later
– Same name as class
– No return type
• Initializers
– Passed as arguments to constructor
– In parentheses to right of class name before semicolon
Class-type ObjectName( value1,value2,…);

 2003 Prentice Hall, Inc. All rights reserved.


47
6.11 Using Default Arguments with
Constructors
• Constructors
– Can specify default arguments
– Default constructors
• Defaults all arguments
OR
• Explicitly requires no arguments
• Can be invoked with no arguments
• Only one per class

 2003 Prentice Hall, Inc. All rights reserved.


48
1 // Fig. 6.12: time2.h
2 // Declaration of class Time.
Outline
3 // Member functions defined in time2.cpp.
4
time2.h (1 of 1)
5 // prevent multiple inclusions of header file
6 #ifndef TIME2_H
7 #define TIME2_H
8
9 // Time abstract data type definition
10 class Time { Default constructor specifying
11 all arguments.
12 public:
13 Time( int = 0, int = 0, int = 0); // default constructor
14 void setTime( int, int, int ); // set hour, minute, second
15 void printUniversal(); // print universal-time format
16 void printStandard(); // print standard-time format
17
18 private:
19 int hour; // 0 - 23 (24-hour clock format)
20 int minute; // 0 - 59
21 int second; // 0 - 59
22
23 }; // end class Time
24
25 #endif

 2003 Prentice Hall, Inc.


All rights reserved.
49
1 // Fig. 6.13: time2.cpp
2 // Member-function definitions for class Time.
Outline
3 #include <iostream>
4
time2.cpp (1 of 3)
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 time2.h
13 #include "time2.h"
14 Constructor calls setTime
15 // Time constructor initializes each data member to zero;
to validate passed (or default)
16 // ensures all Time objects start in a consistent state
values.
17 Time::Time( int hr, int min, int sec )
18 {
19 setTime( hr, min, sec ); // validate and set time
20
21 } // end Time constructor
22

 2003 Prentice Hall, Inc.


All rights reserved.
50
23 // set new Time value using universal time, perform validity
24 // checks on the data values and set invalid values to zero
Outline
25 void Time::setTime( int h, int m, int s )
26 {
time2.cpp (2 of 3)
27 hour = ( h >= 0 && h < 24 ) ? h : 0;
28 minute = ( m >= 0 && m < 60 ) ? m : 0;
29 second = ( s >= 0 && s < 60 ) ? s : 0;
30
31 } // end function setTime
32
33 // print Time in universal format
34 void Time::printUniversal()
35 {
36 cout << setfill( '0' ) << setw( 2 ) << hour << ":"
37 << setw( 2 ) << minute << ":"
38 << setw( 2 ) << second;
39
40 } // end function printUniversal
41

 2003 Prentice Hall, Inc.


All rights reserved.
51
42 // print Time in standard format
43 void Time::printStandard()
Outline
44 {
45 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
time2.cpp (3 of 3)
46 << ":" << setfill( '0' ) << setw( 2 ) << minute
47 << ":" << setw( 2 ) << second
48 << ( hour < 12 ? " AM" : " PM" );
49
50 } // end function printStandard

 2003 Prentice Hall, Inc.


All rights reserved.
52
1 // Fig. 6.14: fig06_14.cpp
2 // Demonstrating a default constructor for class Time.
Outline
3 #include <iostream>
4
fig06_14.cpp
5 using std::cout;
6 using std::endl;
(1 of 2)
7
8 // include definition of class Time from time2.h
9 #include "time2.h"
10
11 int main()
12 { Initialize Time
13 Time t1; // all arguments defaulted objects using
14 Time t2( 2 ); // minute and second defaulted
default arguments.
15 Time t3( 21, 34 ); // second defaulted
16 Time t4( 12, 25, 42 ); // all values specified
17 Time t5( 27, 74, 99 ); // all bad values specified
18
19 cout << "Constructed with:\n\n" Initialize Time object with
20 << "all default arguments:\n "; invalid values; validity
21 t1.printUniversal(); // 00:00:00 checking will set values to 0.
22 cout << "\n ";
23 t1.printStandard(); // 12:00:00 AM
24

 2003 Prentice Hall, Inc.


All rights reserved.
53
25 cout << "\n\nhour specified; default minute and second:\n ";
26 t2.printUniversal(); // 02:00:00
Outline
27 cout << "\n ";
28 t2.printStandard(); // 2:00:00 AM
fig06_14.cpp
29
30 cout << "\n\nhour and minute specified; default second:\n ";
(2 of 2)
31 t3.printUniversal(); // 21:34:00
32 cout << "\n ";
33 t3.printStandard(); // 9:34:00 PM
34
35 cout << "\n\nhour, minute, and second specified:\n ";
36 t4.printUniversal(); // 12:25:42
37 cout << "\n ";
38 t4.printStandard(); // 12:25:42 PM
39 t5 constructed with invalid
40 cout << "\n\nall invalid values specified:\n "; arguments; values set to 0.
41 t5.printUniversal(); // 00:00:00
42 cout << "\n ";
43 t5.printStandard(); // 12:00:00 AM
44 cout << endl;
45
46 return 0;
47
48 } // end main

 2003 Prentice Hall, Inc.


All rights reserved.
54
Constructed with:
Outline
all default arguments:
00:00:00
fig06_14.cpp
12:00:00 AM
output (1 of 1)
hour specified; default minute and second:
02:00:00
2:00:00 AM

hour and minute specified; default second:


21:34:00
9:34:00 PM

hour, minute, and second specified:


12:25:42
12:25:42 PM

all invalid values specified:


00:00:00
12:00:00 AM

 2003 Prentice Hall, Inc.


All rights reserved.
55

6.12 Destructors

• Destructors
– Special member function
– Same name as class
• Preceded with tilde (~)
– No arguments
– No return value
– Cannot be overloaded
– Performs “termination housekeeping”
• Before system reclaims object’s memory
– Reuse memory for new objects
– No explicit destructor
• Compiler creates “empty” destructor”

 2003 Prentice Hall, Inc. All rights reserved.


56
6.13 When Constructors and Destructors
Are Called
• Constructors and destructors
– Called implicitly by compiler
• Order of function calls
– Depends on order of execution
• When execution enters and exits scope of objects
– Generally, destructor calls reverse order of constructor calls

 2003 Prentice Hall, Inc. All rights reserved.


57
6.13 When Constructors and Destructors
Are Called
• Order of constructor, destructor function calls
– Global scope objects
• Constructors
– Before any other function (including main)
• Destructors
– When main terminates (or exit function called)
– Not called if program terminates with abort
– Automatic local objects
• Constructors
– When objects defined
• Each time execution enters scope
• Destructors
– When objects leave scope
• Execution exits block in which object defined
– Not called if program ends with exit or abort
 2003 Prentice Hall, Inc. All rights reserved.
58
6.13 When Constructors and Destructors
Are Called
• Order of constructor, destructor function calls
– static local objects
• Constructors
– Exactly once
– When execution reaches point where object defined
• Destructors
– When main terminates or exit function called
– Not called if program ends with abort

 2003 Prentice Hall, Inc. All rights reserved.


59
1 // Fig. 6.15: create.h
2 // Definition of class CreateAndDestroy.
Outline
3 // Member functions defined in create.cpp.
4 #ifndef CREATE_H
create.h (1 of 1)
5 #define CREATE_H
6
7 class CreateAndDestroy {
8
Constructor and destructor
9 public: member functions.
10 CreateAndDestroy( int, char * ); // constructor
11 ~CreateAndDestroy(); // destructor
private members to show
12
order of constructor,
13 private:
14 int objectID;
destructor function calls.
15 char *message;
16
17 }; // end class CreateAndDestroy
18
19 #endif

 2003 Prentice Hall, Inc.


All rights reserved.
60
1 // Fig. 6.16: create.cpp
2 // Member-function definitions for class CreateAndDestroy
Outline
3 #include <iostream>
4
create.cpp (1 of 2)
5 using std::cout;
6 using std::endl;
7
8 // include CreateAndDestroy class definition from create.h
9 #include "create.h"
10
11 // constructor
12 CreateAndDestroy::CreateAndDestroy(
13 int objectNumber, char *messagePtr )
14 { Output message to
15 objectID = objectNumber;
demonstrate timing of
16 message = messagePtr;
constructor function calls.
17
18 cout << "Object " << objectID << " constructor runs "
19 << message << endl;
20
21 } // end CreateAndDestroy constructor
22

 2003 Prentice Hall, Inc.


All rights reserved.
61
23 // destructor
24 CreateAndDestroy::~CreateAndDestroy()
Outline
25 {
26 Output
// the following line is for pedagogic messageonly
purposes to
create.cpp (2 of 2)
27 cout << ( objectID == 1 || objectIDdemonstrate
== 6 ? "\n"timing
: "" of
);
28 destructor function calls.
29 cout << "Object " << objectID << " destructor runs "
30 << message << endl;
31
32 } // end ~CreateAndDestroy destructor

 2003 Prentice Hall, Inc.


All rights reserved.
62
1 // Fig. 6.17: fig06_17.cpp
2 // Demonstrating the order in which constructors and
Outline
3 // destructors are called.
4 #include <iostream>
fig06_17.cpp
5
6 using std::cout;
(1 of 3)
7 using std::endl;
8
9 // include CreateAndDestroy class definition from create.h
10 #include "create.h"
11 Create variable with global
12 void create( void ); // prototype
scope.
13
14 // global object
15 CreateAndDestroy first( 1, "(global before main)" );
16
17 int main() Create local automatic object.
18 {
19 cout << "\nMAIN FUNCTION: EXECUTION BEGINS" << endl;
Create static local object.
20
21 CreateAndDestroy second( 2, "(local automatic in main)" );
22
23 static CreateAndDestroy third(
24 3, "(local static in main)" );
25

 2003 Prentice Hall, Inc.


All rights reserved.
63
26 create(); // call function to create objects
27
Outline
28 cout << "\nMAIN FUNCTION: EXECUTION RESUMES" << endl;
29
Create local automatic fig06_17.cpp
30 CreateAndDestroy fourth( 4, "(local automatic in main)" );
31
objects. (2 of 3)
32 cout << "\nMAIN FUNCTION: EXECUTION ENDS" << endl;
33
34 return 0;
Create local automatic object.
35
36 } // end main
37
38 // function to create objects
39 void create( void )
Create local automatic object
40 {
41
in function.
cout << "\nCREATE FUNCTION: EXECUTION BEGINS" << endl;
42
Create static local object
43 CreateAndDestroy fifth( 5,in"(local
function.automatic in create)" );
44
45 Create local
static CreateAndDestroy sixth( automatic object
46 in function.
6, "(local static in create)" );
47
48 CreateAndDestroy seventh(
49 7, "(local automatic in create)" );
50

 2003 Prentice Hall, Inc.


All rights reserved.
64
51 cout << "\nCREATE FUNCTION: EXECUTION ENDS\" << endl;
52
Outline
53 } // end function create

fig06_17.cpp
(3 of 3)

 2003 Prentice Hall, Inc.


All rights reserved.
65
Object 1 constructor runs (global before main)
Outline
MAIN FUNCTION: EXECUTION BEGINS
Object 2 constructor runs (local automatic in main)
fig06_17.cpp
Object 3 constructor runs (local static in main)
output (1 of 1)
CREATE FUNCTION: EXECUTION BEGINS
Object 5 constructor runs (local automatic in create)
Object 6 constructor runs (local static in create)
Object 7 constructor runs (local automatic in create)
Local static
Destructors object exists
for local
CREATE FUNCTION: EXECUTION ENDS Global
until object
program
automatic constructed
in main
termination.
objects
Object 7 destructor runs (local automatic in create) Local main execution
beforeautomatic objects and
called in reverseobject
Local static order of
Object 5 destructor runs (local automatic in create) destroyed last. function
after
constructors.
constructed on first function
execution ends in reverse
MAIN FUNCTION: EXECUTION RESUMES call and destroyed after main
order of construction.
Object 4 constructor runs (local automatic in main) execution ends.

MAIN FUNCTION: EXECUTION ENDS


Object 4 destructor runs (local automatic in main)
Object 2 destructor runs (local automatic in main)
Object 6 destructor runs (local static in create)
Object 3 destructor runs (local static in main)

Object 1 destructor runs (global before main)

 2003 Prentice Hall, Inc.


All rights reserved.
66

6.14 Using Set and Get Functions

• Set functions
– Perform validity checks before modifying private data
– Notify if invalid values
– Indicate with return values
• Get functions
– “Query” functions
– Control format of data returned

 2003 Prentice Hall, Inc. All rights reserved.


67
1 // Fig. 6.18: time3.h
2 // Declaration of class Time.
Outline
3 // Member functions defined in time3.cpp
4
time3.h (1 of 2)
5 // prevent multiple inclusions of header file
6 #ifndef TIME3_H
7 #define TIME3_H
8
9 class Time {
10
11 public:
12 Time( int = 0, int = 0, int = 0 ); // default constructor
13
Set functions.
14 // set functions
15 void setTime( int, int, int ); // set hour, minute, second
16 void setHour( int ); // set hour
17 void setMinute( int ); // set minute
18 void setSecond( int ); // set second
19 Get functions.
20 // get functions
21 int getHour(); // return hour
22 int getMinute(); // return minute
23 int getSecond(); // return second
24

 2003 Prentice Hall, Inc.


All rights reserved.
68
25 void printUniversal(); // output universal-time format
26 void printStandard(); // output standard-time format
Outline
27
28 private:
time3.h (2 of 2)
29 int hour; // 0 - 23 (24-hour clock format)
30 int minute; // 0 - 59
31 int second; // 0 - 59
32
33 }; // end clas Time
34
35 #endif

 2003 Prentice Hall, Inc.


All rights reserved.
69
1 // Fig. 6.19: time3.cpp
2 // Member-function definitions for Time class.
Outline
3 #include <iostream>
4
time3.cpp (1 of 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 time3.h
13 #include "time3.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 hr, int min, int sec )
19 {
20 setTime( hr, min, sec );
21
22 } // end Time constructor
23

 2003 Prentice Hall, Inc.


All rights reserved.
70
24 // set hour, minute and second values
25 void Time::setTime( int h, int m, int s )
Outline
26 {
27 setHour( h );
time3.cpp (2 of 4)
28 setMinute( m );
29 setSecond( s );
30 Call set functions to perform
31 } // end function setTime validity checking.
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
Set functions perform validity
40 // set minute value
41 void Time::setMinute( int m )
checks before modifying data.
42 {
43 minute = ( m >= 0 && m < 60 ) ? m : 0;
44
45 } // end function setMinute
46

 2003 Prentice Hall, Inc.


All rights reserved.
Set function performs validity 71
47 // set second value
48 void Time::setSecond( int s ) checks before modifying data. Outline
49 {
50 second = ( s >= 0 && s < 60 ) ? s : 0;
time3.cpp (3 of 4)
51
52 } // end function setSecond
53
54 // return hour value
55 int Time::getHour()
56 {
57 return hour;
58
59 } // end function getHour
Get functions allow client to
60
61 // return minute value
read data.
62 int Time::getMinute()
63 {
64 return minute;
65
66 } // end function getMinute
67

 2003 Prentice Hall, Inc.


All rights reserved.
72
68 // return second value
69 int Time::getSecond()
Outline
70 {
71 return second;
time3.cpp (4 of 4)
72
73 } // end function getSecond Get function allows client to
74 read data.
75 // print Time in universal format
76 void Time::printUniversal()
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()
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

 2003 Prentice Hall, Inc.


All rights reserved.
73
1 // Fig. 6.20: fig06_20.cpp
2 // Demonstrating the Time class set and get functions
Outline
3 #include <iostream>
4
fig06_20.cpp
5 using std::cout;
6 using std::endl;
(1 of 3)
7
8 // include definition of class Time from time3.h
9 #include "time3.h"
10
11 void incrementMinutes( Time &, const int ); // prototype
12
13 int main()
Invoke set functions to set
14 {
valid values.
15 Time t; // create Time object
16
17 // set time using individual set functions
18 t.setHour( 17 ); // set hour to valid value
19 t.setMinute( 34 ); // set minute to valid value
20 t.setSecond( 25 ); // set second to valid value
21

 2003 Prentice Hall, Inc.


All rights reserved.
74
22 // use get functions to obtain hour, minute and second
23 cout << "Result of setting all valid values:\n"
Outline
24 << " Hour: " << t.getHour()
25 << " Minute: " << t.getMinute() Attempt to set invalid values
26 << " Second: " << t.getSecond(); using set functions. fig06_20.cpp
27
(2 of 3)
28 // set time using individual set functions
29 t.setHour( 234 ); // invalid hour set to 0
30 t.setMinute( 43 ); // set minute to valid value
31 t.setSecond( 6373 ); // invalid second set to 0
Invalid values result in setting
32
data members to 0.
33 // display hour, minute and second after setting
34 // invalid hour and second values
35 cout << "\n\nResult of attempting to set invalid hour and"
36 << " second:\n Hour: " << t.getHour()
37 << " Minute: " << t.getMinute()
Modify data members using
38 << " Second: " << t.getSecond() << "\n\n";
function setTime.
39
40 t.setTime( 11, 58, 0 ); // set time
41 incrementMinutes( t, 3 ); // increment t's minute by 3
42
43 return 0;
44
45 } // end main
46

 2003 Prentice Hall, Inc.


All rights reserved.
75
47 // add specified number of minutes to a Time object
48 void incrementMinutes( Time &tt, const int count )
Outline
49 {
50 cout << "Incrementing minute " << count
fig06_20.cpp
51 << " times:\nStart time: ";
Using get functions to 3)
(3 of read
52 tt.printStandard();
53
data and set functions to
54 for ( int i = 0; i < count; i++ ) { modify data.
55 tt.setMinute( ( tt.getMinute() + 1 ) % 60 );
56
57 if ( tt.getMinute() == 0 )
58 tt.setHour( ( tt.getHour() + 1 ) % 24);
59
60 cout << "\nminute + 1: ";
61 tt.printStandard();
62
63 } // end for
64
65 cout << endl;
66
67 } // end function incrementMinutes

 2003 Prentice Hall, Inc.


All rights reserved.
76
Result of setting all valid values:
Hour: 17 Minute: 34 Second: 25
Outline

Result of attempting to set invalid hour and second:


fig06_20.cpp
Hour: 0 Minute: 43 Second: 0
output (1 of 1)
Incrementing minute 3 times:
Start time: 11:58:00 AM
minute + 1: 11:59:00 AM
Attempting to set data
minute + 1: 12:00:00 PM members with invalid values
minute + 1: 12:01:00 PM results in error message and
members set to 0.

 2003 Prentice Hall, Inc.


All rights reserved.
77
6.15 Subtle Trap: Returning a Reference to
a private Data Member
• Reference to object
– Alias for name of object
– Lvalue
• Can receive value in assignment statement
– Changes original object
• Returning references
– public member functions can return non-const
references to private data members
• Client able to modify private data members

 2003 Prentice Hall, Inc. All rights reserved.


78
1 // Fig. 6.21: time4.h
2 // Declaration of class Time.
Outline
3 // Member functions defined in time4.cpp
4
time4.h (1 of 1)
5 // prevent multiple inclusions of header file
6 #ifndef TIME4_H
7 #define TIME4_H
8
9 class Time {
10
11 public:
12 Time( int = 0, int = 0, int = 0 );
13 void setTime( int, int, int );
Function to demonstrate
14 int getHour(); effects of returning reference
15 to private data member.
16 int &badSetHour( int ); // DANGEROUS reference return
17
18 private:
19 int hour;
20 int minute;
21 int second;
22
23 }; // end class Time
24
25 #endif

 2003 Prentice Hall, Inc.


All rights reserved.
79
1 // Fig. 6.22: time4.cpp
2 // Member-function definitions for Time class.
Outline
3
4 // include definition of class Time from time4.h
time4.cpp (1 of 2)
5 #include "time4.h"
6
7 // constructor function to initialize private data;
8 // calls member function setTime to set variables;
9 // default values are 0 (see class definition)
10 Time::Time( int hr, int min, int sec )
11 {
12 setTime( hr, min, sec );
13
14 } // end Time constructor
15
16 // set values of hour, minute and second
17 void Time::setTime( int h, int m, int s )
18 {
19 hour = ( h >= 0 && h < 24 ) ? h : 0;
20 minute = ( m >= 0 && m < 60 ) ? m : 0;
21 second = ( s >= 0 && s < 60 ) ? s : 0;
22
23 } // end function setTime
24

 2003 Prentice Hall, Inc.


All rights reserved.
80
25 // return hour value
26 int Time::getHour()
Outline
27 {
28 return hour;
time4.cpp (2 of 2)
29
30 } // end function getHour
31
32 // POOR PROGRAMMING PRACTICE:
33 // Returning a reference to a private data member.
34 int &Time::badSetHour( int hh ) Return reference to private
35 {
data member hour.
36 hour = ( hh >= 0 && hh < 24 ) ? hh : 0;
37
38 return hour; // DANGEROUS reference return
39
40 } // end function badSetHour

 2003 Prentice Hall, Inc.


All rights reserved.
81
1 // Fig. 6.23: fig06_23.cpp
2 // Demonstrating a public member function that
Outline
3 // returns a reference to a private data member.
4 #include <iostream>
fig06_23.cpp
5
6 using std::cout;
(1 of 2)
7 using std::endl;
8
9 // include definition of class Time from time4.h
10 #include "time4.h"
11
12 int main()
13 {
14 Time t; badSetHour returns
15 reference to private data
16 // store in hourRef the reference returned by member hour.
badSetHour
17 int &hourRef = t.badSetHour( 20 );
18
19 Reference
cout << "Hour before modification: allows setting
" << hourRef; of
20 private data member
21 // use hourRef to set invalid value
hour.in Time object t
22 hourRef = 30;
23
24 cout << "\nHour after modification: " << t.getHour();
25

 2003 Prentice Hall, Inc.


All rights reserved.
82
26 // Dangerous: Function call that returns
27 // a reference can be used as an lvalue!
Outline
28 t.badSetHour( 12 ) = 74;
29
fig06_23.cpp
30 cout << "\n\n*********************************\n"
31 << Can use function call as
"POOR PROGRAMMING PRACTICE!!!!!!!!\n"
(2 of 2)
32 << "badSetHour as an lvalue, lvalue
Hour: to
" set invalid value.
33 << t.getHour() fig06_23.cpp
34 << "\n*********************************" << endl; output (1 of 1)
35
36 return 0;
37
38 } // end main

Hour before modification: 20


Hour after modification: 30
Returning reference allowed
********************************* invalid setting of private
POOR PROGRAMMING PRACTICE!!!!!!!! data member hour.
badSetHour as an lvalue, Hour: 74
*********************************

 2003 Prentice Hall, Inc.


All rights reserved.
83

6.16 Default Memberwise Assignment

• Assigning objects
– Assignment operator (=)
• Can assign one object to another of same type
• Default: memberwise assignment
– Each right member assigned individually to left member
• Passing, returning objects
– Objects passed as function arguments
– Objects returned from functions
– Default: pass-by-value
• Copy of object passed, returned
– Copy constructor
• Copy original values into new object

 2003 Prentice Hall, Inc. All rights reserved.


84
1 // Fig. 6.24: fig06_24.cpp
2 // Demonstrating that class objects can be assigned
Outline
3 // to each other using default memberwise assignment.
4 #include <iostream>
fig06_24.cpp
5
6 using std::cout;
(1 of 3)
7 using std::endl;
8
9 // class Date definition
10 class Date {
11
12 public:
13 Date( int = 1, int = 1, int = 1990 ); // default constructor
14 void print();
15
16 private:
17 int month;
18 int day;
19 int year;
20
21 }; // end class Date
22

 2003 Prentice Hall, Inc.


All rights reserved.
85
23 // Date constructor with no range checking
24 Date::Date( int m, int d, int y )
Outline
25 {
26 month = m;
fig06_24.cpp
27 day = d;
28 year = y;
(2 of 3)
29
30 } // end Date constructor
31
32 // print Date in the format mm-dd-yyyy
33 void Date::print()
34 {
35 cout << month << '-' << day << '-' << year;
36
37 } // end function print
38
39 int main()
40 {
41 Date date1( 7, 4, 2002 );
42 Date date2; // date2 defaults to 1/1/1990
43

 2003 Prentice Hall, Inc.


All rights reserved.
86
44 cout << "date1 = ";
45 date1.print();
Outline
46 cout << "\ndate2 = "; Default memberwise
47 date2.print(); assignment assigns each
fig06_24.cpp
48 member of date1
49 date2 = date1; // default memberwise assignment
(3 of 3)
individually to each member
50 of date2.
51 cout << "\n\nAfter default memberwise assignment, date2 = "; fig06_24.cpp
52 date2.print(); output (1 of 1)
53 cout << endl;
54
55 return 0;
56
57 } // end main

date1 = 7-4-2002
date2 = 1-1-1990

After default memberwise assignment, date2 = 7-4-2002

 2003 Prentice Hall, Inc.


All rights reserved.
87

6.17 Software Reusability

• Software reusability
– Class libraries
• Well-defined
• Carefully tested
• Well-documented
• Portable
• Widely available
– Speeds development of powerful, high-quality software
• Rapid applications development (RAD)
– Resulting problems
• Cataloging schemes
• Licensing schemes
• Protection mechanisms

 2003 Prentice Hall, Inc. All rights reserved.

You might also like