1 classes and data abstraction part ii. 2 6.10 initializing class objects: constructors constructors...

50
1 Classes and Data Abstraction Part II

Upload: neal-roland-houston

Post on 04-Jan-2016

222 views

Category:

Documents


0 download

TRANSCRIPT

1

Classes and Data Abstraction

Part II

2

6.10 Initializing Class Objects: Constructors Constructors

Initialize data members Same name as class No return type

Initializers Passed as arguments to constructor In parentheses to right of class name before

semicolonClass-type ObjectName( value1,value2,…);

3

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

4

time2.h (1 of 1)

1 // Fig. 6.12: time2.h2 // Declaration of class Time.3 // Member functions defined in time2.cpp.4 5 // prevent multiple inclusions of header file6 #ifndef TIME2_H7 #define TIME2_H 9 // Time abstract data type definition10 class Time { 12 public:13 Time( int = 0, int = 0, int = 0); // default constructor14 void setTime( int, int, int ); // set hour, minute, second15 void printUniversal(); // print universal-time format16 void printStandard(); // print standard-time format17 18 private:19 int hour; // 0 - 23 (24-hour clock format)20 int minute; // 0 - 5921 int second; // 0 - 5922 23 }; // end class Time

24 25 #endif

Default constructor specifying all arguments.

5

time2.cpp (1 of 3)

1 // Fig. 6.13: time2.cpp

2 // Member-function definitions for class Time.

3 #include <iostream> 4 using std::cout;

5 6 #include <iomanip> 7 using std::setfill;

8 using std::setw;

9 10 // include definition of class Time from time2.h

11 #include "time2.h"

12 13 // Time constructor initializes each data member to zero;

14 // ensures all Time objects start in a consistent state

15 Time::Time( int hr, int min, int sec )

16 { 17 setTime( hr, min, sec ); // validate and set time

18 19 } // end Time constructor

20

Constructor calls setTime to validate passed (or default) values.

6

time2.cpp (2 of 3)

21 // set new Time value using universal time, perform validity

22 // checks on the data values and set invalid values to zero

23 void Time::setTime( int h, int m, int s )

24 {25 hour = ( h >= 0 && h < 24 ) ? h : 0;

26 minute = ( m >= 0 && m < 60 ) ? m : 0;

27 second = ( s >= 0 && s < 60 ) ? s : 0;

28 29 } // end function setTime

30 31 // print Time in universal format

32 void Time::printUniversal()

33 {34 cout << setfill( '0' ) << setw( 2 ) << hour << ":"

35 << setw( 2 ) << minute << ":"

36 << setw( 2 ) << second;

37 38 } // end function printUniversal

39

7

time2.cpp (3 of 3)

40 // print Time in standard format

41 void Time::printStandard()

42 {43 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )

44 << ":" << setfill( '0' ) << setw( 2 ) << minute

45 << ":" << setw( 2 ) << second

46 << ( hour < 12 ? " AM" : " PM" );

47 48 } // end function printStandard

8

fig06_14.cpp (1 of 2)

1 // Fig. 6.14: fig06_14.cpp 2 // Demonstrating a default constructor for class Time.3 #include <iostream> 4 using std::cout;5 using std::endl; 6 // include definition of class Time from time2.h7 #include "time2.h"8 9 int main()10 {11 Time t1; // all arguments defaulted 12 Time t2( 2 ); // minute and second defaulted13 Time t3( 21, 34 ); // second defaulted 14 Time t4( 12, 25, 42 ); // all values specified 15 Time t5( 27, 74, 99 ); // all bad values specified 16 17 cout << "Constructed with:\n\n"18 << "all default arguments:\n ";19 t1.printUniversal(); // 00:00:0020 cout << "\n ";21 t1.printStandard(); // 12:00:00 AM

Initialize Time objects using default arguments.

Initialize Time object with invalid values; validity checking will set values to 0.

9

22 cout << "\n\nhour specified; default minute and second:\n "; 23 t2.printUniversal(); // 02:00:0024 cout << "\n ";25 t2.printStandard(); // 2:00:00 AM26 27 cout << "\n\nhour and minute specified; default second:\n "; 28 t3.printUniversal(); // 21:34:0029 cout << "\n ";30 t3.printStandard(); // 9:34:00 PM31 32 cout << "\n\nhour, minute, and second specified:\n ";33 t4.printUniversal(); // 12:25:4234 cout << "\n ";35 t4.printStandard(); // 12:25:42 PM36 37 cout << "\n\nall invalid values specified:\n ";38 t5.printUniversal(); // 00:00:00 39 cout << "\n "; 40 t5.printStandard(); // 12:00:00 AM 41 cout << endl;42 43 return 0; 44 } // end main

t5 constructed with invalid arguments; values set to 0.

fig06_14.cpp (2 of 2)

10

fig06_14.cpp output (1 of 1)

Constructed with:

 

all default arguments:

00:00:00

12:00:00 AM

 

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

11

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”

12

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

13

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

14

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

15

create.h (1 of 1)

1 // Fig. 6.15: create.h

2 // Definition of class CreateAndDestroy.

3 // Member functions defined in create.cpp.

4 #ifndef CREATE_H

5 #define CREATE_H

6 7 class CreateAndDestroy {

8 9 public:

10 CreateAndDestroy( int, char * ); // constructor

11 ~CreateAndDestroy(); // destructor

12 13 private:

14 int objectID;

15 char *message;

16 17 }; // end class CreateAndDestroy

18 19 #endif

Constructor and destructor member functions.

private members to show order of constructor, destructor function calls.

16

create.cpp (1 of 2)

1 // Fig. 6.16: create.cpp

2 // Member-function definitions for class CreateAndDestroy

3 #include <iostream> 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 { 15 objectID = objectNumber;

16 message = messagePtr;

17 18 cout << "Object " << objectID << " constructor runs "

19 << message << endl;

20 21 } // end CreateAndDestroy constructor

Output message to demonstrate timing of constructor function calls.

17

create.cpp (2 of 2)

23 // destructor

24 CreateAndDestroy::~CreateAndDestroy()

25 { 26 // the following line is for pedagogic purposes only

27 cout << ( objectID == 1 || objectID == 6 ? "\n" : "" );

28 29 cout << "Object " << objectID << " destructor runs "

30 << message << endl;

31 32 } // end ~CreateAndDestroy destructor

Output message to demonstrate timing of destructor function calls.

18

fig06_17.cpp(1 of 3)

1 // Fig. 6.17: fig06_17.cpp

2 // Demonstrating the order in which constructors and

3 // destructors are called.

4 #include <iostream> 5 using std::cout;

6 using std::endl;

7 8 // include CreateAndDestroy class definition from create.h

9 #include "create.h"

10 11 void create( void ); // prototype 12 // global object

13 CreateAndDestroy first( 1, "(global before main)" );

14 15 int main() {16 cout << "\nMAIN FUNCTION: EXECUTION BEGINS" << endl;

17 18 CreateAndDestroy second( 2, "(local automatic in main)" ); 19 static CreateAndDestroy third( 3, "(local static in main)" );

Create variable with global scope.

Create local automatic object.

Create static local object.

19

fig06_17.cpp(2 of 3)

20 create(); // call function to create objects

21 22 cout << "\nMAIN FUNCTION: EXECUTION RESUMES" << endl; 23 CreateAndDestroy fourth( 4, "(local automatic in main)" );

24 25 cout << "\nMAIN FUNCTION: EXECUTION ENDS" << endl; 26 return 0; 27 } // end main

28 29 // function to create objects

30 void create( void ) {31 cout << "\nCREATE FUNCTION: EXECUTION BEGINS" << endl;

32 33 CreateAndDestroy fifth( 5, "(local automatic in create)" );

34 static CreateAndDestroy sixth( 6, "(local static in create)" );

38 CreateAndDestroy seventh( 7, "(local automatic in create)" );

3940 cout << "\nCREATE FUNCTION: EXECUTION ENDS" << endl;

41 42 } // end function create

Create local automatic objects.

Create local automatic object.

Create local automatic object in function.

Create static local object in function.Create local automatic object in function.

20

Object 1 constructor runs (global before main) MAIN FUNCTION: EXECUTION BEGINSObject 2 constructor runs (local automatic in main)Object 3 constructor runs (local static in main) CREATE FUNCTION: EXECUTION BEGINSObject 5 constructor runs (local automatic in create)Object 6 constructor runs (local static in create)Object 7 constructor runs (local automatic in create) CREATE FUNCTION: EXECUTION ENDSObject 7 destructor runs (local automatic in create)Object 5 destructor runs (local automatic in create) MAIN FUNCTION: EXECUTION RESUMESObject 4 constructor runs (local automatic in main) MAIN FUNCTION: EXECUTION ENDSObject 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)

Destructors for local automatic objects in main called in reverse order of constructors.

Local static object exists until program termination.

Global object constructed before main execution and destroyed last.

Local automatic objects destroyed after function execution ends in reverse order of construction.

fig06_17.cppoutput (1 of 1)

21

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

22

time3.h (1 of 2)

1 // Fig. 6.18: time3.h

2 // Declaration of class Time.

3 // Member functions defined in time3.cpp

4 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 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

Set functions.

23

time3.h (2 of 2)

20 // get functions 21 int getHour(); // return hour 22 int getMinute(); // return minute23 int getSecond(); // return second24 25 void printUniversal(); // output universal-time format26 void printStandard(); // output standard-time format27 28 private:29 int hour; // 0 - 23 (24-hour clock format)30 int minute; // 0 - 5931 int second; // 0 - 5932 33 }; // end clas Time34 35 #endif

Get functions.

24

time3.cpp (1 of 4)

1 // Fig. 6.19: time3.cpp

2 // Member-function definitions for Time class.

3 #include <iostream> 4 using std::cout;

5 6 #include <iomanip> 7 using std::setfill;

8 using std::setw;

9 10 // include definition of class Time from time3.h

11 #include "time3.h"

12 13 // constructor function to initialize private data;

14 // calls member function setTime to set variables;

15 // default values are 0 (see class definition)

16 Time::Time( int hr, int min, int sec ) { 17 setTime( hr, min, sec ); 18 } // end Time constructor

19

25

time3.cpp (2 of 4)

20 // set hour, minute and second values

21 void Time::setTime( int h, int m, int s ) {22 setHour( h );

23 setMinute( m );

24 setSecond( s ); 25 } // end function setTime

26 27 // set hour value

28 void Time::setHour( int h ) { 29 hour = ( h >= 0 && h < 24 ) ? h : 0;

30 } // end function setHour

31 32 // set minute value

33 void Time::setMinute( int m ) {

34 minute = ( m >= 0 && m < 60 ) ? m : 0;

35 } // end function setMinute

36

Call set functions to perform validity checking.

Set functions perform validity checks before modifying data.

26

time3.cpp (3 of 4)

37 // set second value

38 void Time::setSecond( int s ) {

39 second = ( s >= 0 && s < 60 ) ? s : 0;

40 } // end function setSecond

41 42 // return hour value

43 int Time::getHour() { 44 return hour; 45 } // end function getHour

46 47 // return minute value

48 int Time::getMinute() { 49 return minute; 50 } // end function getMinute

51

Set function performs validity checks before modifying data.

Get functions allow client to read data.

27

time3.cpp (4 of 4)

52 // return second value

53 int Time::getSecond() { 54 return second; 55 } // end function getSecond

56 57 // print Time in universal format

58 void Time::printUniversal() {59 cout << setfill( '0' ) << setw( 2 ) << hour << ":"

60 << setw( 2 ) << minute << ":"

61 << setw( 2 ) << second; 62 } // end function printUniversal

63 64 // print Time in standard format

65 void Time::printStandard() {66 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )

67 << ":" << setfill( '0' ) << setw( 2 ) << minute

68 << ":" << setw( 2 ) << second

69 << ( hour < 12 ? " AM" : " PM" ); 70 } // end function printStandard

Get function allows client to read data.

28

fig06_20.cpp(1 of 3)

1 // Fig. 6.20: fig06_20.cpp

2 // Demonstrating the Time class set and get functions

3 #include <iostream> 4 using std::cout;

5 using std::endl;

6 7 // include definition of class Time from time3.h

8 #include "time3.h"

9 10 void incrementMinutes( Time &, const int ); // prototype

11 12 int main() {13 Time t; // create Time object

14 15 // set time using individual set functions

16 t.setHour( 17 ); // set hour to valid value

17 t.setMinute( 34 ); // set minute to valid value

18 t.setSecond( 25 ); // set second to valid value

19

Invoke set functions to set valid values.

29

fig06_20.cpp(2 of 3)

20 // use get functions to obtain hour, minute and second

21 cout << "Result of setting all valid values:\n"

22 << " Hour: " << t.getHour() << " Minute: " << t.getMinute()

23 << " Second: " << t.getSecond();

24 25 // set time using individual set functions

26 t.setHour( 234 ); // invalid hour set to 0

27 t.setMinute( 43 ); // set minute to valid value

28 t.setSecond( 6373 ); // invalid second set to 0

29 30 // display hour, minute and second after setting

31 // invalid hour and second values

32 cout << "\n\nResult of attempting to set invalid hour and"

33 << " second:\n Hour: " << t.getHour() << " Minute: " << t.getMinute()

34 << " Second: " << t.getSecond() << "\n\n";

35 36 t.setTime( 11, 58, 0 ); // set time

37 incrementMinutes( t, 3 ); // increment t's minute by 3 38 return 0; 39 } // end main

Attempt to set invalid values using set functions.

Invalid values result in setting data members to 0.

Modify data members using function setTime.

30

fig06_20.cpp(3 of 3)

40 // add specified number of minutes to a Time object

41 void incrementMinutes( Time &tt, const int count ) {42 cout << "Incrementing minute " << count

43 << " times:\nStart time: ";

44 tt.printStandard();

45 46 for ( int i = 0; i < count; i++ ) {

47 tt.setMinute( ( tt.getMinute() + 1 ) % 60 );

48 49 if ( tt.getMinute() == 0 )

50 tt.setHour( ( tt.getHour() + 1 ) % 24);

51 52 cout << "\nminute + 1: ";

53 tt.printStandard(); 54 } // end for

55 56 cout << endl; 57 } // end function incrementMinutes

Using get functions to read data and set functions to modify data.

31

fig06_20.cppoutput (1 of 1)

Result of setting all valid values:

Hour: 17 Minute: 34 Second: 25

 

Result of attempting to set invalid hour and second:

Hour: 0 Minute: 43 Second: 0

 

Incrementing minute 3 times:

Start time: 11:58:00 AM

minute + 1: 11:59:00 AM

minute + 1: 12:00:00 PM

minute + 1: 12:01:00 PM

Attempting to set data members with invalid values results in members set to 0.

32

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

33

fig06_24.cpp (1 of 3)

1 // Fig. 6.24: fig06_24.cpp

2 // Demonstrating that class objects can be assigned

3 // to each other using default memberwise assignment.

4 #include <iostream> 5 using std::cout;

6 using std::endl;

7 8 // class Date definition

9 class Date { 10 public:

11 Date( int = 1, int = 1, int = 1990 ); // default constructor

12 void print();

13 14 private:

15 int month;

16 int day;

17 int year;

18 19 }; // end class Date

20

34

fig06_24.cpp (2 of 3)

21 // Date constructor with no range checking

22 Date::Date( int m, int d, int y ) {23 month = m;

24 day = d;

25 year = y;

26 27 } // end Date constructor

28 29 // print Date in the format mm-dd-yyyy

30 void Date::print() { 31 cout << month << '-' << day << '-' << year;

32 33 } // end function print

34 35 int main() {36 Date date1( 7, 4, 2002 );

37 Date date2; // date2 defaults to 1/1/1990

38

35

fig06_24.cpp (3 of 3)

fig06_24.cpp output (1 of 1)

44 cout << "date1 = ";

45 date1.print();

46 cout << "\ndate2 = ";

47 date2.print();

48 49 date2 = date1; // default memberwise assignment

50 51 cout << "\n\nAfter default memberwise assignment, date2 = ";

52 date2.print();

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

Default memberwise assignment assigns each member of date1 individually to each member of date2.

36

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

37

Strings

The string class comes from the C++ standard library #include <string>

Good news – use comparison operators (==, !=, <, etc.), assignment, and plus

Bad news – cannot cast integers and rational numbers as strings

38

Constructors and Destructorsstring s; Default constructor. Creates an empty string

string s (str); Copy constructor. Creates a new string s as a copy of another string, str

string s(str,

indx);

Creates a new string s from characters starting at index indx of str

string s(str,

indx, count);

Creates a new string s initialized by at most count characters from str, starting at index indx in str

string s(cstr); Creates a new string s initialized with characters from the cstring cstr

string s(charArray,

count);Creates a new string s initialized with at most count characters from char array charArray

string s(count,

ch);

Creates a new string s initialized with count instances of character ch

s.~string(); Destructor. Frees the memory allocated to string s

39

Constructor examples

string s0(“string”); string s1; string s2(s0); string s3(buffer); string s4(buffer, 1); string s5(5, ‘f’);

string

Ø

string

hi

h

fffff

40

Access to string Elements

c = s[i] Indexed access with no range checking. Character at index i is returned

c = s.at(i) Indexed access with range checking. Character at index i is returned. Throws an out_of_range excepetion if i ≥ s.size()

41

string size methods

s.length() Returns the number of characters currently in s

s.size() Same as s.length()

s.resize(newSize, padChar)

Changes the size of s to newSize, filling with repetitions of the character padChar if necessary

s.empty() Returns true if s is empty, else returns false

s.capacity() Returns the number of characters that s can contain without having to reallocate

42

string Search and Substringss.find(str) Returns the integer index of the first position of the

first occurrence of string str in s

s.find(str,

pos)

Returns the integer index of the first position of the first occurrence of string str in s, with the search starting at position pos of s

s.find_first_of

(delim, pos)

Returns the integer index of the first position of the first occurrence of any character from the string delim, with the search starting at position pos of s

s.find_first_not_of(delim, pos)

Returns the integer index of the first position of the first occurrence of any character not in the string delim, with the search starting at position pos of s

s.substr(pos, len)

Returns a string object that represents a substring of s of at most len characters, starting at position pos of s. If pos is too large, an out_of_range exception is thrown

43

string Comparisonss1 == s2 Returns true if all characters of s1 and s2 are

pairwise equal, else turns false

s1 != s2 Returns true if not all characters of s1 and s2 are pairwise equal, else returns false

s1 < s2 Returns true if s1 comes before s2 lexicographically, else returns false

s1 > s2 Returns true if s1 comes after s2 lexicographically, else returns false

s1 <= s2 Same as !(s1 > s2)

S1 >= s2 Same as !(s1 < s2)

Lexicographic ordering compares characters at corresponding positions sequentiallyuntil a position i is found where s1[i] ≠ s2[i]. Then the expression s1 < s2 has the same Boolean value as s1[i] < s2[i].

44

string I/O Operationsos << str Places the characters from string str onto

stream os

is >> str Extracts characters from stream is into string str. Leading whitespace characters are skipped, and input stops at the first trailing whitespace character

getline(is,

str, delimiter)

Reads characters from stream is into string str up to end-of-file or until the character delimiter is extracted. The delimiter is removed from is and discarded. Note: getline is not a member of the string class. It is a stand-alone, global function.

More complete list of class methods: http://www.msoe.edu/eecs/cese/resources/stl/string.htm

45

fig08_13.cpp(1 of 4)

1 // Fig. 8.13: fig08_13.cpp

2 // Standard library string class test program.

3 #include <iostream> 4 using std::cout;

5 using std::endl; 6 #include <string> 7 using std::string;

8 9 int main() {10 string s1( "happy" );

11 string s2( " birthday" );

12 string s3;

13 14 // test overloaded equality and relational operators

15 cout << "s1 is \"" << s1 << "\"; s2 is \"" << s2

16 << "\"; s3 is \"" << s3 << '\"'

17 << "\n\nThe results of comparing s2 and s1:"

18 << "\ns2 == s1 yields "

19 << ( s2 == s1 ? "true" : "false" )

20 << "\ns2 != s1 yields "

21 << ( s2 != s1 ? "true" : "false" )

46

fig08_13.cpp(2 of 4)

21 << "\ns2 > s1 yields "

22 << ( s2 > s1 ? "true" : "false" )

23 << "\ns2 < s1 yields "

24 << ( s2 < s1 ? "true" : "false" )

25 << "\ns2 >= s1 yields "

26 << ( s2 >= s1 ? "true" : "false" )

27 << "\ns2 <= s1 yields "

28 << ( s2 <= s1 ? "true" : "false" );

29 30 // test string member function empty

31 cout << "\n\nTesting s3.empty():\n"; 32 if ( s3.empty() ) {

33 cout << "s3 is empty; assigning s1 to s3;\n";

34 s3 = s1; // assign s1 to s3

35 cout << "s3 is \"" << s3 << "\"";

36 }37 38 // test overloaded string concatenation operator

39 cout << "\n\ns1 += s2 yields s1 = ";

40 s1 += s2; // test overloaded concatenation

41 cout << s1;

47

fig08_13.cpp(3 of 4)

42 // test overloaded string concatenation operator

43 // with C-style string

44 cout << "\n\ns1 += \" to you\" yields\n";

45 s1 += " to you";

46 cout << "s1 = " << s1 << "\n\n";

47 48 // test string member function substr

49 cout << "The substring of s1 starting at location 0 for\n"

50 << "14 characters, s1.substr(0, 14), is:\n"

51 << s1.substr( 0, 14 ) << "\n\n";

52 53 // test substr "to-end-of-string" option

54 cout << "The substring of s1 starting at\n"

55 << "location 15, s1.substr(15), is:\n"

56 << s1.substr( 15 ) << '\n';

57

48

fig08_13.cpp(4 of 4)

58 // test using subscript operator to create lvalue

59 s1[ 0 ] = 'H';

60 s1[ 6 ] = 'B';

61 cout << "\ns1 after s1[0] = 'H' and s1[6] = 'B' is: "

62 << s1 << "\n\n";

63 64 // test subscript out of range with string member function "at"

65 cout << "Attempt to assign 'd' to s1.at( 30 ) yields:" << endl;

66 s1.at( 30 ) = 'd'; // ERROR: subscript out of range

67 68 return 0;

69 70 } // end main

49

s1 is "happy"; s2 is " birthday"; s3 is ""

 

The results of comparing s2 and s1:

s2 == s1 yields false

s2 != s1 yields true

s2 > s1 yields false

s2 < s1 yields true

s2 >= s1 yields false

s2 <= s1 yields true

 

Testing s3.empty():

s3 is empty; assigning s1 to s3;

s3 is "happy"

 

s1 += s2 yields s1 = happy birthday

 

 

fig08_13.cppoutput (1 of 2)

50

s1 += " to you" yields

s1 = happy birthday to you

 

The substring of s1 starting at location 0 for

14 characters, s1.substr(0, 14), is:

happy birthday

The substring of s1 starting at

location 15, s1.substr(15), is:

to you

 

s1 after s1[0] = 'H' and s1[6] = 'B' is: Happy Birthday to you

Attempt to assign 'd' to s1.at( 30 ) yields:

 

abnormal program termination

fig08_13.cppoutput (2 of 2)