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)