Classes and Data Abstraction

50
1 Classes and Data Abstraction Part II

description

Classes and Data Abstraction. Part II. 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 semicolon - PowerPoint PPT Presentation

Transcript of Classes and Data Abstraction

Page 1: Classes and Data Abstraction

1

Classes and Data Abstraction

Part II

Page 2: Classes and Data Abstraction

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,…);

Page 3: Classes and Data Abstraction

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

Page 4: Classes and Data Abstraction

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.

Page 5: Classes and Data Abstraction

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.

Page 6: Classes and Data Abstraction

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

Page 7: Classes and Data Abstraction

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

Page 8: Classes and Data Abstraction

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.

Page 9: Classes and Data Abstraction

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)

Page 10: Classes and Data Abstraction

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

Page 11: Classes and Data Abstraction

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”

Page 12: Classes and Data Abstraction

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

Page 13: Classes and Data Abstraction

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

Page 14: Classes and Data Abstraction

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

Page 15: Classes and Data Abstraction

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.

Page 16: Classes and Data Abstraction

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.

Page 17: Classes and Data Abstraction

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.

Page 18: Classes and Data Abstraction

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.

Page 19: Classes and Data Abstraction

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.

Page 20: Classes and Data Abstraction

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)

Page 21: Classes and Data Abstraction

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

Page 22: Classes and Data Abstraction

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.

Page 23: Classes and Data Abstraction

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.

Page 24: Classes and Data Abstraction

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

Page 25: Classes and Data Abstraction

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.

Page 26: Classes and Data Abstraction

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.

Page 27: Classes and Data Abstraction

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.

Page 28: Classes and Data Abstraction

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.

Page 29: Classes and Data Abstraction

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.

Page 30: Classes and Data Abstraction

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.

Page 31: Classes and Data Abstraction

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.

Page 32: Classes and Data Abstraction

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

Page 33: Classes and Data Abstraction

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

Page 34: Classes and Data Abstraction

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

Page 35: Classes and Data Abstraction

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.

Page 36: Classes and Data Abstraction

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

Page 37: Classes and Data Abstraction

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

Page 38: Classes and Data Abstraction

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

Page 39: Classes and Data Abstraction

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

Page 40: Classes and Data Abstraction

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()

Page 41: Classes and Data Abstraction

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

Page 42: Classes and Data Abstraction

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

Page 43: Classes and Data Abstraction

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].

Page 44: Classes and Data Abstraction

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

Page 45: Classes and Data Abstraction

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" )

Page 46: Classes and Data Abstraction

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;

Page 47: Classes and Data Abstraction

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

Page 48: Classes and Data Abstraction

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

Page 49: Classes and Data Abstraction

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)

Page 50: Classes and Data Abstraction

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)