1 Lecture 6 Classes and Data Abstraction: Part II.

50
1 Lecture 6 Classes and Data Abstraction: Part II

description

3 6.2 Structure Definitions struct definition  Creates new data type used to declare variables  Structure variables declared like variables of other types  Examples: Time timeObject; Time timeArray[ 10 ]; struct vs. class  One difference By default everything in struct is public By default everything in class is private  Practical difference Generally, struct only has data, no methods Class has both data and methods

Transcript of 1 Lecture 6 Classes and Data Abstraction: Part II.

Page 1: 1 Lecture 6 Classes and Data Abstraction: Part II.

1

Lecture 6

Classes and Data Abstraction: Part II

Page 2: 1 Lecture 6 Classes and Data Abstraction: Part II.

2

6.2 Structure Definitions

Structures Aggregate data types built using elements of other types

struct Time {int hour; int minute; int second;

}; Structure member naming

In same struct: must have unique names In different structs: can share name

struct definition must end with semicolon

Structure tag

Structure members

Page 3: 1 Lecture 6 Classes and Data Abstraction: Part II.

3

6.2 Structure Definitions struct definition

Creates new data type used to declare variables Structure variables declared like variables of other types Examples:

Time timeObject; Time timeArray[ 10 ];

struct vs. class One difference

By default everything in struct is public By default everything in class is private

Practical difference Generally, struct only has data, no methods Class has both data and methods

Page 4: 1 Lecture 6 Classes and Data Abstraction: Part II.

4

6.3 Accessing Structure Members Member access operators

Dot operator (.) for structure and class members Print member hour of timeObject:

cout << timeObject.hour;

Page 5: 1 Lecture 6 Classes and Data Abstraction: Part II.

5

3.17 References and Reference Parameters Call by value

Copy of data passed to function Changes to copy do not change original Prevent unwanted side effects

Call by reference Function can directly access data Changes affect original

Page 6: 1 Lecture 6 Classes and Data Abstraction: Part II.

6

3.17 References and Reference Parameters Reference parameter

Alias for argument in function call Passes parameter by reference

Use & after data type in prototype void myFunction( int &data ) Read “data is a reference to an int”

Function call format the same However, original can now be changed

Page 7: 1 Lecture 6 Classes and Data Abstraction: Part II.

7

fig03_20.cpp(1 of 2)

1 // Fig. 3.20: fig03_20.cpp2 // Comparing pass-by-value and pass-by-reference3 // with references.4 #include <iostream>5 6 using std::cout;7 using std::endl;8 9 int squareByValue( int ); // function prototype10 void squareByReference( int & ); // function prototype11 12 int main()13 {14 int x = 2;15 int z = 4;16 17 // demonstrate squareByValue18 cout << "x = " << x << " before squareByValue\n";19 cout << "Value returned by squareByValue: "20 << squareByValue( x ) << endl; 21 cout << "x = " << x << " after squareByValue\n" << endl;22

Page 8: 1 Lecture 6 Classes and Data Abstraction: Part II.

8

fig03_20.cpp(2 of 2)

23 // demonstrate squareByReference24 cout << "z = " << z << " before squareByReference" << endl;25 squareByReference( z );26 cout << "z = " << z << " after squareByReference" << endl;27 28 return 0; // indicates successful termination29 } // end main30 31 // squareByValue multiplies number by itself, stores the 32 // result in number and returns the new value of number 33 int squareByValue( int number ) 34 { 35 return number *= number; // caller's argument not modified36 37 } // end function squareByValue 38 39 // squareByReference multiplies numberRef by itself and 40 // stores the result in the variable to which numberRef 41 // refers in function main 42 void squareByReference( int &numberRef ) 43 { 44 numberRef *= numberRef; // caller's argument modified45 46 } // end function squareByReference

Page 9: 1 Lecture 6 Classes and Data Abstraction: Part II.

9

fig03_20.cppoutput (1 of 1)

x = 2 before squareByValueValue returned by squareByValue: 4x = 2 after squareByValue z = 4 before squareByReferencez = 16 after squareByReference

Page 10: 1 Lecture 6 Classes and Data Abstraction: Part II.

10

3.17 References and Reference Parameters Pointers (chapter 5)

Another way to pass-by-reference References as aliases to other variables

Refer to same variable Can be used within a function

int count = 1; // declare integer variable countint &cRef = count; // create cRef as an alias for count++cRef; // increment count (using its alias)

References must be initialized when declared Otherwise, compiler error Dangling reference

Reference to undefined variable

Page 11: 1 Lecture 6 Classes and Data Abstraction: Part II.

11

fig03_21.cpp(1 of 1)

1 // Fig. 3.21: fig03_21.cpp2 // References must be initialized.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 int main()9 {10 int x = 3;11 12 // y refers to (is an alias for) x13 int &y = x; 14 15 cout << "x = " << x << endl << "y = " << y << endl;16 y = 7;17 cout << "x = " << x << endl << "y = " << y << endl;18 19 return 0; // indicates successful termination20 21 } // end main

Page 12: 1 Lecture 6 Classes and Data Abstraction: Part II.

12

x = 3y = 3x = 7y = 7

fig03_21.cppoutput (1 of 1)

Page 13: 1 Lecture 6 Classes and Data Abstraction: Part II.

13

fig03_22.cpp(1 of 1)

1 // Fig. 3.22: fig03_22.cpp2 // References must be initialized.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 int main()9 {10 int x = 3;11 int &y; // Error: y must be initialized12 13 cout << "x = " << x << endl << "y = " << y << endl;14 y = 7;15 cout << "x = " << x << endl << "y = " << y << endl;16 17 return 0; // indicates successful termination18 19 } // end main

Page 14: 1 Lecture 6 Classes and Data Abstraction: Part II.

14

Borland C++ command-line compiler error message:

 Error E2304 Fig03_22.cpp 11: Reference variable 'y' must be

initialized in function main() Microsoft Visual C++ compiler error message: D:\cpphtp4_examples\ch03\Fig03_22.cpp(11)

: error C2530: 'y' : references must be initialized

fig03_22.cppoutput (1 of 1)

Page 15: 1 Lecture 6 Classes and Data Abstraction: Part II.

15

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

Page 16: 1 Lecture 6 Classes and Data Abstraction: Part II.

16

fig06_01.cpp(1 of 4)

1 // Fig. 6.1: fig06_01.cpp2 // Create a structure, set its members, and print it.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 #include <iomanip>9 10 using std::setfill;11 using std::setw;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 19 }; // end struct Time 20

Page 17: 1 Lecture 6 Classes and Data Abstraction: Part II.

17

fig06_01.cpp(2 of 4)

21 void printUniversal( const Time & ); // prototype22 void printStandard( const Time & ); // prototype23 24 int main()25 {26 Time dinnerTime; // variable of new type Time 27 28 dinnerTime.hour = 18; // set hour member of dinnerTime 29 dinnerTime.minute = 30; // set minute member of dinnerTime30 dinnerTime.second = 0; // set second member of dinnerTime31 32 cout << "Dinner will be held at ";33 printUniversal( dinnerTime );34 cout << " universal time,\nwhich is ";35 printStandard( dinnerTime ); 36 cout << " standard time.\n";37 38 dinnerTime.hour = 29; // set hour to invalid value 39 dinnerTime.minute = 73; // set minute to invalid value

Page 18: 1 Lecture 6 Classes and Data Abstraction: Part II.

18

fig06_01.cpp(3 of 4)

40 41 cout << "\nTime with invalid values: ";42 printUniversal( dinnerTime );43 cout << endl;44 45 return 0; 46 47 } // end main48 49 // print time in universal-time format50 void printUniversal( const Time &t )51 {52 cout << setfill( '0' ) << setw( 2 ) << t.hour << ":"53 << setw( 2 ) << t.minute << ":" 54 << setw( 2 ) << t.second;55 56 } // end function printUniversal57

Page 19: 1 Lecture 6 Classes and Data Abstraction: Part II.

19

fig06_01.cpp(4 of 4)

fig06_01.cppoutput (1 of 1)

58 // print time in standard-time format59 void printStandard( const Time &t )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

Page 20: 1 Lecture 6 Classes and Data Abstraction: Part II.

20

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

Page 21: 1 Lecture 6 Classes and Data Abstraction: Part II.

21

time1.h (1 of 1)

1 // Fig. 6.5: time1.h 2 // Declaration of class Time. 3 // Member functions are defined in time1.cpp4 5 // prevent multiple inclusions of header file6 #ifndef TIME1_H7 #define TIME1_H8 9 // Time abstract data type definition10 class Time { 11 public:12 Time(); // constructor13 void setTime( int, int, int ); // set hour, minute, second14 void printUniversal(); // print universal-time format15 void printStandard(); // print standard-time format16 17 private:18 int hour; // 0 - 23 (24-hour clock format)19 int minute; // 0 - 5920 int second; // 0 - 59 21 }; // end class Time22 23 #endif

Page 22: 1 Lecture 6 Classes and Data Abstraction: Part II.

22

fig06_08.cpp(1 of 1)

1 // Fig. 6.8: fig06_08.cpp2 // Demonstrate errors resulting from attempts3 // to access private class members. 4 #include <iostream>5 6 using std::cout;7 8 // include definition of class Time from time1.h9 #include "time1.h"10 11 int main()12 {13 Time t; // create Time object14 16 t.hour = 7; // error: 'Time::hour' is not accessible17 18 // error: 'Time::minute' is not accessible19 cout << "minute = " << t.minute; 20 21 return 0;22 23 } // end main

Page 23: 1 Lecture 6 Classes and Data Abstraction: Part II.

23

fig06_08.cppoutput (1 of 1)D:\cpphtp4_examples\ch06\Fig6_06\Fig06_06.cpp(16) : error C2248:

'hour' : cannot access private member declared in class 'Time'D:\cpphtp4_examples\ch06\Fig6_06\Fig06_06.cpp(19) : error C2248: 'minute' : cannot access private member declared in class 'Time'

Page 24: 1 Lecture 6 Classes and Data Abstraction: Part II.

24

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

Page 25: 1 Lecture 6 Classes and Data Abstraction: Part II.

25

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

Page 26: 1 Lecture 6 Classes and Data Abstraction: Part II.

26

Static Functions

Functions associated with a class but do not need access to any data Function is declared static in header file

Associated with class, but not an instance of the class Example

In MyDate.hstatic int daysInMonth(Months mon, int yr); In MyDate.cppint MyDate::daysInMonth(Months mon, int yr) {…} When calling methodint day = MyDate::daysInMonth(month, year);

Page 27: 1 Lecture 6 Classes and Data Abstraction: Part II.

27

salesp.h (1 of 1)

1 // Fig. 6.9: salesp.h2 // SalesPerson class definition.3 // Member functions defined in salesp.cpp.4 #ifndef SALESP_H5 #define SALESP_H6 7 class SalesPerson {8 9 public:10 SalesPerson(); // constructor11 void getSalesFromUser(); // input sales from keyboard12 void setSales( int, double ); // set sales for a month13 void printAnnualSales(); // summarize and print sales14 15 private: 16 double totalAnnualSales(); // utility function17 double sales[ 12 ]; // 12 monthly sales figures18 19 }; // end class SalesPerson20 21 #endif

Page 28: 1 Lecture 6 Classes and Data Abstraction: Part II.

28

salesp.cpp (1 of 3)

1 // Fig. 6.10: salesp.cpp2 // Member functions for class SalesPerson.3 #include <iostream>4 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.h15 #include "salesp.h"16 17 // initialize elements of array sales to 0.018 SalesPerson::SalesPerson()19 {20 for ( int i = 0; i < 12; i++ )21 sales[ i ] = 0.0;22 23 } // end SalesPerson constructor24

Page 29: 1 Lecture 6 Classes and Data Abstraction: Part II.

29

salesp.cpp (2 of 3)

25 // get 12 sales figures from the user at the keyboard26 void SalesPerson::getSalesFromUser() {27 double salesFigure; 28 29 for ( int i = 1; i <= 12; i++ ) {30 cout << "Enter sales amount for month " << i << ": ";31 cin >> salesFigure;32 setSales( i, salesFigure ); 33 } // end for 34 } // end function getSalesFromUser35 36 // set one of the 12 monthly sales figures; function subtracts37 // one from month value for proper subscript in sales array38 void SalesPerson::setSales( int month, double amount )39 {40 // test for valid month and amount values41 if ( month >= 1 && month <= 12 && amount > 0 )42 sales[ month - 1 ] = amount; // adjust for subscripts 0-1143 44 else // invalid month or amount value45 cout << "Invalid month or sales figure" << endl; 46 } // end function setSales

Page 30: 1 Lecture 6 Classes and Data Abstraction: Part II.

30

salesp.cpp (3 of 3)

47 // print total annual sales (with help of utility function)48 void SalesPerson::printAnnualSales() {49 cout << setprecision( 2 ) << fixed 50 << "\nThe total annual sales are: $" 51 << totalAnnualSales() << endl; // call utility function52 53 } // end function printAnnualSales54 55 // private utility function to total annual sales 56 double SalesPerson::totalAnnualSales() { 57 double total = 0.0; // initialize total 58 59 for ( int i = 0; i < 12; i++ ) // summarize sales results60 total += sales[ i ]; 61 62 return total; 63 64 } // end function totalAnnualSales

Page 31: 1 Lecture 6 Classes and Data Abstraction: Part II.

31

fig06_11.cpp(1 of 1)

1 // Fig. 6.11: fig06_11.cpp2 // Demonstrating a utility function.3 // Compile this program with salesp.cpp4 5 // include SalesPerson class definition from salesp.h6 #include "salesp.h" 7 8 int main()9 {10 SalesPerson s; // create SalesPerson object s11 12 s.getSalesFromUser(); // note simple sequential code; no13 s.printAnnualSales(); // control structures in main14 15 return 0;16 17 } // end main

Page 32: 1 Lecture 6 Classes and Data Abstraction: Part II.

32

fig06_11.cppoutput (1 of 1)

Enter sales amount for month 1: 5314.76Enter sales amount for month 2: 4292.38Enter sales amount for month 3: 4589.83Enter sales amount for month 4: 5534.03Enter sales amount for month 5: 4376.34Enter sales amount for month 6: 5698.45Enter sales amount for month 7: 4439.22Enter sales amount for month 8: 5893.57Enter sales amount for month 9: 4909.67Enter sales amount for month 10: 5123.45Enter sales amount for month 11: 4024.97Enter sales amount for month 12: 5923.92 The total annual sales are: $60120.59

Page 33: 1 Lecture 6 Classes and Data Abstraction: Part II.

33

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 34: 1 Lecture 6 Classes and Data Abstraction: Part II.

34

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 35: 1 Lecture 6 Classes and Data Abstraction: Part II.

35

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 36: 1 Lecture 6 Classes and Data Abstraction: Part II.

36

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 37: 1 Lecture 6 Classes and Data Abstraction: Part II.

37

create.h (1 of 1)

1 // Fig. 6.15: create.h2 // Definition of class CreateAndDestroy.3 // Member functions defined in create.cpp.4 #include <string>5 #ifndef CREATE_H6 #define CREATE_H7 8 class CreateAndDestroy {9 10 public:11 CreateAndDestroy( int, string ); // constructor12 ~CreateAndDestroy(); // destructor 13 14 private:15 int objectID;16 string message;17 18 }; // end class CreateAndDestroy19 20 #endif

Page 38: 1 Lecture 6 Classes and Data Abstraction: Part II.

38

create.cpp (1 of 2)

1 // Fig. 6.16: create.cpp2 // Member-function definitions for class CreateAndDestroy3 #include <iostream> 5 using std::cout;6 using std::endl;7 8 // include CreateAndDestroy class definition from create.h9 #include "create.h"10 11 // constructor 12 CreateAndDestroy::CreateAndDestroy( 13 int objectNumber, string messageStr ) 14 { 15 objectID = objectNumber; 16 message = messageStr; 17 18 cout << "Object " << objectID << " constructor runs "19 << message << endl; 20 21 } // end CreateAndDestroy constructor

Page 39: 1 Lecture 6 Classes and Data Abstraction: Part II.

39

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

Page 40: 1 Lecture 6 Classes and Data Abstraction: Part II.

40

fig06_17.cpp(1 of 3)

1 // Fig. 6.17: fig06_17.cpp2 // Demonstrating the order in which constructors and3 // destructors are called.4 #include <iostream> 5 using std::cout;6 using std::endl;7 8 // include CreateAndDestroy class definition from create.h9 #include "create.h"10 11 void create( void ); // prototype 12 // global object13 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)" );

Page 41: 1 Lecture 6 Classes and Data Abstraction: Part II.

41

fig06_17.cpp(2 of 3)

20 create(); // call function to create objects21 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 main28 29 // function to create objects30 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

Page 42: 1 Lecture 6 Classes and Data Abstraction: Part II.

42

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)

fig06_17.cppoutput (1 of 1)

Page 43: 1 Lecture 6 Classes and Data Abstraction: Part II.

43

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 44: 1 Lecture 6 Classes and Data Abstraction: Part II.

44

fig06_24.cpp (1 of 3)

1 // Fig. 6.24: fig06_24.cpp 2 // Demonstrating that class objects can be assigned3 // to each other using default memberwise assignment.4 #include <iostream> 5 using std::cout;6 using std::endl;7 8 // class Date definition9 class Date { 10 public:11 Date( int = 1, int = 1, int = 1990 ); // default constructor12 void print();13 14 private:15 int month;16 int day;17 int year;18 19 }; // end class Date20

Page 45: 1 Lecture 6 Classes and Data Abstraction: Part II.

45

fig06_24.cpp (2 of 3)

21 // Date constructor with no range checking22 Date::Date( int m, int d, int y ) {23 month = m;24 day = d;25 year = y;26 27 } // end Date constructor28 29 // print Date in the format mm-dd-yyyy30 void Date::print() { 31 cout << month << '-' << day << '-' << year; 32 33 } // end function print34 35 int main() {36 Date date1( 7, 4, 2002 );37 Date date2; // date2 defaults to 1/1/199038

Page 46: 1 Lecture 6 Classes and Data Abstraction: Part II.

46

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 assignment50 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-2002date2 = 1-1-1990 After default memberwise assignment, date2 = 7-4-2002

Page 47: 1 Lecture 6 Classes and Data Abstraction: Part II.

47

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 48: 1 Lecture 6 Classes and Data Abstraction: Part II.

48

Constants Constants should be inside classes when appropriate

Prevents pollution of namespace Declaring constants

In header filestatic const <type> <constant name>;Example: static const char REFERENCE_PREFIX; In .cpp fileconst <type> <class name>::<constant name> =

<value>;Example: const char LibraryBook::REFERENCE_PREFIX =

'R'; Using constant<class name>::<constant name>Example: LibraryBook::REFERENCE_PREFIX

Page 49: 1 Lecture 6 Classes and Data Abstraction: Part II.

49

Objects as Parameters

Special case when you pass an object that is the same type as the class Have access to all the private data of both objects

Object method was invoked on (i.e. book1 if you called book1.method())

Object that was passed as a parameter Object method invoked on is called this

Save it in a variable <class name> obj = *this;

Reference private date with <variable name>.<private data>

Page 50: 1 Lecture 6 Classes and Data Abstraction: Part II.

50

Example: Pass Object as Parameter Want a method that reports which line is steeper

between two Line2Ds One line is steeper if its slope is larger

bool Line2D::isSteeper(const Line2D& other) {Line2D& obj = *this;if (obj.slope > other.slope)

return true;else

return false;}