52
1 2000 Prentice Hall, Inc. All rights reserved. 1. Oggetti const e funzioni membro const 2. Composizione: oggetti come membri di classi 3. Funzioni friend e classi friend 4. Uso del puntatore this 5. Allocazione dinamica della memoria con new e delete 6. Membri static 7. Data abstraction e information hiding Esempio: dato astratto queue 8. Classi container e iteratori 9. Classi proxy Capitolo 7: Classi (parte II)

Capitolo 7: Classi (parte II)

  • Upload
    boaz

  • View
    26

  • Download
    0

Embed Size (px)

DESCRIPTION

Capitolo 7: Classi (parte II). Oggetti const e funzioni membro const Composizione: oggetti come membri di classi Funzioni friend e classi friend Uso del puntatore this Allocazione dinamica della memoria con new e delete Membri static Data abstraction e information hiding - PowerPoint PPT Presentation

Citation preview

Page 1: Capitolo 7: Classi (parte II)

1

2000 Prentice Hall, Inc. All rights reserved.

1. Oggetti const e funzioni membro const2. Composizione: oggetti come membri di classi3. Funzioni friend e classi friend 4. Uso del puntatore this5. Allocazione dinamica della memoria con new e delete6. Membri static 7. Data abstraction e information hiding

Esempio: dato astratto queue8. Classi container e iteratori9. Classi proxy

Capitolo 7: Classi (parte II)

Page 2: Capitolo 7: Classi (parte II)

2

2000 Prentice Hall, Inc. All rights reserved.

1. Oggetti const e funzioni membro const

Principio del minimo privilegio– dare solo i permessi necessari, non di più

Keyword const– specifica che un oggetto non è modificabile– ogni tentativo di modifica genera un errore di sintassi– esempio

const Time noon( 12, 0, 0 ); dichiara un oggetto costante della classe Time e lo

inizializza a 12

Page 3: Capitolo 7: Classi (parte II)

3

2000 Prentice Hall, Inc. All rights reserved.

Oggetti const richiedono funzioni const– le funzioni membro dichiarate const non modificano i loro

oggetti– const deve essere specificato nel prototipo e nella definizione– prototipo: Type FunctionName(param1,param2…) const; – definizione: Type FunctionName(param1,param2…) const { …}– esempio:

int A::getValue() const { return privateDataMember };

ritorna il valore di un dato membro, non modifica niente, quindi è dichiarata const

Costruttori e distruttori non possono essere const

Page 4: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline4

Outline1 // Fig. 7.1: time5.h2 // Declaration of the class Time.3 // Member functions defined in time5.cpp4 #ifndef TIME5_H5 #define TIME5_H67 class Time {8 public:9 Time( int = 0, int = 0, int = 0 ); // default constructor1011 // set functions12 void setTime( int, int, int ); // set time13 void setHour( int ); // set hour14 void setMinute( int ); // set minute15 void setSecond( int ); // set second1617 // get functions (normally declared const)18 int getHour() const; // return hour19 int getMinute() const; // return minute20 int getSecond() const; // return second2122 // print functions (normally declared const)23 void printMilitary() const; // print military time24 void printStandard(); // print standard time25 private:26 int hour; // 0 - 2327 int minute; // 0 - 5928 int second; // 0 - 5929 };3031 #endif

1. Class definition

1.1 Function prototypes

1.2 Member variables

const functions

non-const functions

Page 5: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline5

Outline

Source Code1. Load Header

1.1 Function definitions

32 // Fig. 7.1: time5.cpp33 // Member function definitions for Time class.34 #include <iostream>3536 using std::cout;3738 #include "time5.h"3940 // Constructor function to initialize private data.41 // Default values are 0 (see class definition).42 Time::Time( int hr, int min, int sec ) 43 { setTime( hr, min, sec ); }4445 // Set the values of hour, minute, and second.46 void Time::setTime( int h, int m, int s )47 {48 setHour( h );49 setMinute( m );50 setSecond( s );51 }5253 // Set the hour value54 void Time::setHour( int h ) 55 { hour = ( h >= 0 && h < 24 ) ? h : 0; }5657 // Set the minute value58 void Time::setMinute( int m ) 59 { minute = ( m >= 0 && m < 60 ) ? m : 0; }6061 // Set the second value62 void Time::setSecond( int s )63 { second = ( s >= 0 && s < 60 ) ? s : 0; }

il costruttore è non-const

Page 6: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline6

Outline

1.1 Function definitions

1.2 Purposely leave out const keyword for printStandard

64

65 // Get the hour value

66 int Time::getHour() const { return hour; }

67

68 // Get the minute value

69 int Time::getMinute() const { return minute; }

70

71 // Get the second value

72 int Time::getSecond() const { return second; }

73

74 // Display military format time: HH:MM

75 void Time::printMilitary() const

76 {

77 cout << ( hour < 10 ? "0" : "" ) << hour << ":"

78 << ( minute < 10 ? "0" : "" ) << minute;

79 }

80

81 // Display standard format time: HH:MM:SS AM (or PM)

82 void Time::printStandard() // should be const

83 {

84 cout << ( ( hour == 12 ) ? 12 : hour % 12 ) << ":"

85 << ( minute < 10 ? "0" : "" ) << minute << ":"

86 << ( second < 10 ? "0" : "" ) << second

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

88 }

Keyword const nella definizione e prototipo di funzione.

funzioni non-const non possono usare oggetti const, anche se non li modificano (come printStandard).

Page 7: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline7

Outline

1. Initialize variables

2. Attempt to use non-const functions with const objects

Program Output

89 // Fig. 7.1: fig07_01.cpp90 // Attempting to access a const object with91 // non-const member functions.92 #include "time5.h"9394 int main()95 {96 Time wakeUp( 6, 45, 0 ); // non-constant object97 const Time noon( 12, 0, 0 ); // constant object9899 // MEMBER FUNCTION OBJECT100 wakeUp.setHour( 18 ); // non-const non-const101102 noon.setHour( 12 ); // non-const const103104 wakeUp.getHour(); // const non-const105106 noon.getMinute(); // const const107 noon.printMilitary(); // const const108 noon.printStandard(); // non-const const109 return 0;110}

Compiling...Fig07_01.cppd:fig07_01.cpp(14) : error C2662: 'setHour' : cannot convert 'this' pointer from 'const class Time' to 'class Time &'Conversion loses qualifiersd:\fig07_01.cpp(20) : error C2662: 'printStandard' : cannot convert 'this' pointer from 'const class Time' to 'class Time &'Conversion loses qualifiersTime5.cppError executing cl.exe. test.exe - 2 error(s), 0 warning(s)

Compiler errors

Page 8: Capitolo 7: Classi (parte II)

8

2000 Prentice Hall, Inc. All rights reserved.

Sintassi di inizializzatore di membro costante– costruttore per Increment è modificato:

Increment::Increment( int c, int i ): increment(i)

{ count = c; }– : increment(i) initializes increment to i– tutti i dati membro possono essere inizializzati usando questa

sintassi– per const e reference si deve usare per forza– inizializzatori multipli (usa una lista dopo i due punti)

Page 9: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline9

Outline

1. Class definition

1.1 Function definitions

1 // Fig. 7.2: fig07_02.cpp2 // Using a member initializer to initialize a3 // constant of a built-in data type.4 #include <iostream>56 using std::cout;7 using std::endl;89 class Increment {10 public:11 Increment( int c = 0, int i = 1 );12 void addIncrement() { count += increment; }13 void print() const;1415 private:16 int count;17 const int increment; // const data member18 };1920 // Constructor for class Increment21 Increment::Increment( int c, int i )22 : increment( i ) // initializer for const member23 { count = c; }2425 // Print the data26 void Increment::print() const27 {28 cout << "count = " << count29 << ", increment = " << increment << endl;30 }3132 int main()33 {

se provo a inizializzare increment con un assegnamento increment = i è generato un errore.

Page 10: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline10

Outline

1.2 Initialize variables

2. Function calls

3. Output results

34 Increment value( 10, 5 );3536 cout << "Before incrementing: ";37 value.print();3839 for ( int j = 0; j < 3; j++ ) {40 value.addIncrement();41 cout << "After increment " << j + 1 << ": ";42 value.print();43 }4445 return 0;46 }

Before incrementing: count = 10, increment = 5After increment 1: count = 15, increment = 5After increment 2: count = 20, increment = 5After increment 3: count = 25, increment = 5

Page 11: Capitolo 7: Classi (parte II)

11

2000 Prentice Hall, Inc. All rights reserved.

2. Composizione: oggetti come membri di classi

Composizione– una classe ha altre classi come membri

Costruzione degli oggetti– gli oggetti membri sono costruiti nell’ordine di dichiarazione– prima della loro inclusione nella nuova classe (host objects)

Page 12: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline12

Outline

1. Class definition

1.1 Member functions

1.2 Member variables

1 // Fig. 7.4: date1.h

2 // Declaration of the Date class.

3 // Member functions defined in date1.cpp

4 #ifndef DATE1_H

5 #define DATE1_H

6

7 class Date {

8 public:

9 Date( int = 1, int = 1, int = 1900 ); // default constructor

10 void print() const; // print date in month/day/year format

11 ~Date(); // provided to confirm destruction order

12 private:

13 int month; // 1-12

14 int day; // 1-31 based on month

15 int year; // any year

16

17 // utility function to test proper day for month and year

18 int checkDay( int );

19 };

20

21 #endif

Page 13: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline13

Outline

1. Load header

1.1 Function definitions

1.2 Date constructor

22 // Fig. 7.4: date1.cpp23 // Member function definitions for Date class.24 #include <iostream>2526 using std::cout;27 using std::endl;2829 #include "date1.h"3031 // Constructor: Confirm proper value for month;32 // call utility function checkDay to confirm proper33 // value for day.34 Date::Date( int mn, int dy, int yr )35 {36 if ( mn > 0 && mn <= 12 ) // validate the month37 month = mn;38 else {39 month = 1;40 cout << "Month " << mn << " invalid. Set to month 1.\n";41 }4243 year = yr; // should validate yr44 day = checkDay( dy ); // validate the day4546 cout << "Date object constructor for date ";47 print(); // interesting: a print with no arguments48 cout << endl;49 }50

il costruttore stampa una linea quando è chiamato.

Page 14: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline14

Outline

1.3 print function

1.4 Date destructor

1.5 checkDay function

51 // Print Date object in form month/day/year52 void Date::print() const53 { cout << month << '/' << day << '/' << year; }5455 // Destructor: provided to confirm destruction order56 Date::~Date()57 { 58 cout << "Date object destructor for date ";59 print();60 cout << endl;61 }6263 // Utility function to confirm proper day value64 // based on month and year.65 // Is the year 2000 a leap year?66 int Date::checkDay( int testDay )67 {68 static const int daysPerMonth[ 13 ] = 69 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};7071 if ( testDay > 0 && testDay <= daysPerMonth[ month ] )72 return testDay;7374 if ( month == 2 && // February: Check for leap year75 testDay == 29 &&76 ( year % 400 == 0 || 77 ( year % 4 == 0 && year % 100 != 0 ) ) ) 78 return testDay;7980 cout << "Day " << testDay << " invalid. Set to day 1.\n";8182 return 1; // leave object in consistent state if bad value83 }

il distruttore stampa una linea quando è chiamato.

Page 15: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline15

Outline

1. Load header

1.1 Class definition

1.2 Member functions

1.3 Member variables

1.3.1 Include const variables from Date class

84 // Fig. 7.4: emply1.h85 // Declaration of the Employee class.86 // Member functions defined in emply1.cpp87 #ifndef EMPLY1_H88 #define EMPLY1_H8990 #include "date1.h"9192 class Employee {93 public:94 Employee( char *, char *, int, int, int, int, int, int );95 void print() const;96 ~Employee(); // provided to confirm destruction order97 private:98 char firstName[ 25 ];99 char lastName[ 25 ];100 const Date birthDate;101 const Date hireDate;102};103104#endif

composizione – include altre classi.

Page 16: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline16

Outline

1. Load header files

1.1 Function definitions

1.2 Employee constructor

1.2.1 Use member-initializer syntax for const Date members

105// Fig. 7.4: emply1.cpp106// Member function definitions for Employee class.107#include <iostream>108109using std::cout;110using std::endl;111112#include <cstring>113#include "emply1.h"114#include "date1.h"115116Employee::Employee( char *fname, char *lname,117 int bmonth, int bday, int byear,118 int hmonth, int hday, int hyear )119 : birthDate( bmonth, bday, byear ), 120 hireDate( hmonth, hday, hyear )121{122 // copy fname into firstName and be sure that it fits123 int length = strlen( fname );124 length = ( length < 25 ? length : 24 );125 strncpy( firstName, fname, length );126 firstName[ length ] = '\0';127128 // copy lname into lastName and be sure that it fits129 length = strlen( lname );130 length = ( length < 25 ? length : 24 );131 strncpy( lastName, lname, length );132 lastName[ length ] = '\0';133134 cout << "Employee object constructor: "135 << firstName << ' ' << lastName << endl;136}

costruttore stampa una linea

Page 17: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline17

Outline

1.3 print definition

1.4 Employee destructor

137

138void Employee::print() const

139{

140 cout << lastName << ", " << firstName << "\nHired: ";

141 hireDate.print();

142 cout << " Birth date: ";

143 birthDate.print();

144 cout << endl;

145}

146

147// Destructor: provided to confirm destruction order

148Employee::~Employee()

149{

150 cout << "Employee object destructor: "

151 << lastName << ", " << firstName << endl;

152}

la funzione print è const e può stampare oggetti const.

Print non richiede argomenti, perchè è linkata all’oggetto che la chiama.

distruttore stampa una linea.

Page 18: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline18

Outline153// Fig. 7.4: fig07_04.cpp

154// Demonstrating composition: an object with member objects.

155#include <iostream>

156

157using std::cout;

158using std::endl;

159

160#include "emply1.h"

161

162int main()

163{

164 Employee e( "Bob", "Jones", 7, 24, 1949, 3, 12, 1988 );

165

166 cout << '\n';

167 e.print();

168

169 cout << "\nTest Date constructor with invalid values:\n";

170 Date d( 14, 35, 1994 ); // invalid Date values

171 cout << endl;

172 return 0;

173}

1. Load header files

2. Create Employee object

2.1 Attempt invalid Date setting

Page 19: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline19

Outline

Program Output

Date object constructor for date 7/24/1949Date object constructor for date 3/12/1988Employee object constructor: Bob Jones Jones, BobHired: 3/12/1988 Birth date: 7/24/1949 Test Date constructor with invalid values:Month 14 invalid. Set to month 1.Day 35 invalid. Set to day 1.Date object constructor for date 1/1/1994 Date object destructor for date 1/1/1994Employee object destructor: Jones, BobDate object destructor for date 3/12/1988Date object destructor for date 7/24/1949

Nota come gli oggetti più interni sono creati prima e disstrutti dopo.

Page 20: Capitolo 7: Classi (parte II)

20

2000 Prentice Hall, Inc. All rights reserved.

3. Funzioni friend e classi friend Funzioni friend e classi friend

– possono accedere membri private e protected di un’altra classe

– le funzioni friend non sono funzioni membro della classe (definite fuori dallo scope)

Proprietà della friendship– la friendship is concessa, non presa– non simmetrica (se B è friend di A, A non è friend di B) – non transitiva (se A è friend di B, B è friend di C, A

non è friend di C)

Page 21: Capitolo 7: Classi (parte II)

21

2000 Prentice Hall, Inc. All rights reserved.

Dichiarazione friend

– per dichiarare una funzione friend scrivere friend prima del prototipo della funzione nella classe che sta concedento la friendship

friend int myFunction(int x);

– per dichiarare una classe friend scrivere friend class Classname nella classe che sta dando friendship

se ClassOne sta dando friendship a ClassTwo,friend class ClassTwo;

appare in ClassOne

Page 22: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline22

Outline

1. Class definition

1.1 Declare function a friend

1.2 Function definition

1.3 Initialize Count object

1 // Fig. 7.5: fig07_05.cpp 2 // Friends can access private members of a class.3 #include <iostream>45 using std::cout;6 using std::endl;78 // Modified Count class9 class Count {10 friend void setX( Count &, int ); // friend declaration11 public:12 Count() { x = 0; } // constructor13 void print() const { cout << x << endl; } // output14 private:15 int x; // data member16 };1718 // Can modify private data of Count because19 // setX is declared as a friend function of Count20 void setX( Count &c, int val )21 {22 c.x = val; // legal: setX is a friend of Count23 }2425 int main()26 {27 Count counter;2829 cout << "counter.x after instantiation: ";30 counter.print();

setX non è un membro di Count.

setX friend della classe Count (accede ai dati private).

cambio di variabili private.

Page 23: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline23

Outline

2. Modify object

3. Print results

Program Output

31 cout << "counter.x after call to setX friend function: ";

32 setX( counter, 8 ); // set x with a friend

33 counter.print();

34 return 0;

35 }

counter.x after instantiation: 0counter.x after call to setX friend function: 8

Page 24: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline24

Outline

(Previous program without friend declared)

1 // Fig. 7.6: fig07_06.cpp 2 // Non-friend/non-member functions cannot access3 // private data of a class.4 #include <iostream>56 using std::cout;7 using std::endl;89 // Modified Count class10 class Count {11 public:12 Count() { x = 0; } // constructor13 void print() const { cout << x << endl; } // output14 private:15 int x; // data member16 };1718 // Function tries to modify private data of Count,19 // but cannot because it is not a friend of Count.20 void cannotSetX( Count &c, int val )21 {22 c.x = val; // ERROR: 'Count::x' is not accessible23 }2425 int main()26 {27 Count counter;2829 cannotSetX( counter, 3 ); // cannotSetX is not a friend30 return 0;31 }

cannotSetX non è friend della classe Count. Non accede ai dati private.

cannotSetX prova a modificare i dati private...

Page 25: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline25

Outline

Program Output

 Compiling...Fig07_06.cppD:\books\2000\cpphtp3\examples\Ch07\Fig07_06\Fig07_06.cpp(22) : error C2248: 'x' : cannot access private member declared in class 'Count' D:\books\2000\cpphtp3\examples\Ch07\Fig07_06\ Fig07_06.cpp(15) : see declaration of 'x'Error executing cl.exe. test.exe - 1 error(s), 0 warning(s)

compiler error - cannot access private data

Page 26: Capitolo 7: Classi (parte II)

26

2000 Prentice Hall, Inc. All rights reserved.

4. Uso del puntatore this– consente agli oggetti di accedere al proprio indirizzo– non è parte dell’oggetto stesso– Implicit first argument on non-static member function call to the

object – Implicitly reference member data and functions – il tipo del puntatore this dipande dal tipo dell’oggetto e se la

funzione membro che usa il this è const– in una funzione membro non-const di Employee, this ha

tipoEmployee * const

• (puntatore costante a un oggetto Employee) – in una funzione membro const di Employee, this ha tipo

const Employee * const • (puntatore costante a un oggetto costate Employee)

Page 27: Capitolo 7: Classi (parte II)

27

2000 Prentice Hall, Inc. All rights reserved.

Chiamate in cascate di funzioni membro

– la funzione ritorna un puntatore reference allo stesso oggetto{ return *this; }

– altre funzioni possono operare su quel puntatore– le funzioni che non ritornano references devono essere chiamate

per ultime

Page 28: Capitolo 7: Classi (parte II)

28

2000 Prentice Hall, Inc. All rights reserved.

esempi di chamate in cascata:– setHour, setMinute, e setSecond ritornano *this

(reference a un oggetto)

– per l’oggetto t, se si considera la chiamatat.setHour(1).setMinute(2).setSecond(3);

• esegue t.setHour(1), ritorna *this (reference) e l’espressione diventa t.setMinute(2).setSecond(3);

• esegue t.setMinute(2), ritorna la reference e diventa t.setSecond(3);

• esegue t.setSecond(3), ritorna la reference e diventa t;

Page 29: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline29

Outline

1. Class definition

1.1 Function definition

1.2 Initialize object

2. Function call

1 // Fig. 7.7: fig07_07.cpp 2 // Using the this pointer to refer to object members.3 #include <iostream>45 using std::cout;6 using std::endl;78 class Test {9 public:10 Test( int = 0 ); // default constructor11 void print() const;12 private:13 int x;14 };1516 Test::Test( int a ) { x = a; } // constructor1718 void Test::print() const // ( ) around *this required19 {20 cout << " x = " << x21 << "\n this->x = " << this->x22 << "\n(*this).x = " << ( *this ).x << endl;23 }2425 int main()26 {27 Test testObject( 12 );2829 testObject.print();3031 return 0;32 }

stampa x

stampa x usando l’operatore freccia -> partendo dal puntatore this

stampa x usando l’operatore dot (.).

Page 30: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline30

Outline

Program Output

 

x = 12 this->x = 12(*this).x = 12

tutti e tre i metodi hanno lo stesso risultato

Page 31: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline31

Outline

1. Class definition

1 // Fig. 7.8: time6.h2 // Cascading member function calls.34 // Declaration of class Time.5 // Member functions defined in time6.cpp6 #ifndef TIME6_H7 #define TIME6_H89 class Time {10 public:11 Time( int = 0, int = 0, int = 0 ); // default constructor1213 // set functions14 Time &setTime( int, int, int ); // set hour, minute, second15 Time &setHour( int ); // set hour16 Time &setMinute( int ); // set minute17 Time &setSecond( int ); // set second1819 // get functions (normally declared const)20 int getHour() const; // return hour21 int getMinute() const; // return minute22 int getSecond() const; // return second2324 // print functions (normally declared const)25 void printMilitary() const; // print military time26 void printStandard() const; // print standard time27 private:28 int hour; // 0 - 2329 int minute; // 0 - 5930 int second; // 0 - 5931 };3233 #endif

nota che le funzioni Time & - ritornano una reference a un oggetto Time.

Page 32: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline32

Outline

1. Load header file

1.1 Function definitions

34 // Fig. 7.8: time.cpp 35 // Member function definitions for Time class.36 #include <iostream>3738 using std::cout;3940 #include "time6.h"4142 // Constructor function to initialize private data.43 // Calls member function setTime to set variables.44 // Default values are 0 (see class definition).45 Time::Time( int hr, int min, int sec ) 46 { setTime( hr, min, sec ); }4748 // Set the values of hour, minute, and second.49 Time &Time::setTime( int h, int m, int s )50 {51 setHour( h );52 setMinute( m );53 setSecond( s ); 54 return *this; // enables cascading55 }5657 // Set the hour value58 Time &Time::setHour( int h )59 {60 hour = ( h >= 0 && h < 24 ) ? h : 0;6162 return *this; // enables cascading63 }64

ritornare *this consente la chiamata di funzioni a cascata

Page 33: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline33

Outline

1.1 Function definitions

65 // Set the minute value66 Time &Time::setMinute( int m )67 {68 minute = ( m >= 0 && m < 60 ) ? m : 0;6970 return *this; // enables cascading71 }7273 // Set the second value74 Time &Time::setSecond( int s )75 {76 second = ( s >= 0 && s < 60 ) ? s : 0;7778 return *this; // enables cascading79 }8081 // Get the hour value82 int Time::getHour() const { return hour; }8384 // Get the minute value85 int Time::getMinute() const { return minute; }8687 // Get the second value88 int Time::getSecond() const { return second; }8990 // Display military format time: HH:MM91 void Time::printMilitary() const92 {93 cout << ( hour < 10 ? "0" : "" ) << hour << ":"94 << ( minute < 10 ? "0" : "" ) << minute;

ritornare *this consente la chiamata di funzioni a cascata

Page 34: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline34

Outline

1.1 Function definitions--------------------------1. Load header

1.1 Initialize Time object

2. Function calls

3. Print values

95 }9697 // Display standard format time: HH:MM:SS AM (or PM)98 void Time::printStandard() const99 {100 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) 101 << ":" << ( minute < 10 ? "0" : "" ) << minute 102 << ":" << ( second < 10 ? "0" : "" ) << second103 << ( hour < 12 ? " AM" : " PM" );104}105// Fig. 7.8: fig07_08.cpp106// Cascading member function calls together107// with the this pointer108#include <iostream>109110using std::cout;111using std::endl;112113#include "time6.h"114115int main()116{117 Time t;118119 t.setHour( 18 ).setMinute( 30 ).setSecond( 22 );120 cout << "Military time: ";121 t.printMilitary();122 cout << "\nStandard time: ";123 t.printStandard();124125 cout << "\n\nNew standard time: ";126 t.setTime( 20, 20, 20 ).printStandard();

cascading function calls

printStandard deve essere chiamata dopo setTime perchè printStandard non restituisce una reference.

t.printStandard().setTime(); causa un errore.

printStandard non resturuisce reference

Page 35: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline35

Outline

Program Output

127 cout << endl;

128

129 return 0;

130}

Military time: 18:30Standard time: 6:30:22 PM New standard time: 8:20:20 PM

Page 36: Capitolo 7: Classi (parte II)

36

2000 Prentice Hall, Inc. All rights reserved.

5. Allocazione dinamica della memoria con new e delete

– usati per l’allocazione dinamica della memoria (superiori a malloc e free del C)

– new crea un oggetto delle giusta dimensione, chiama il suo costruttore e ritorna un puntatore del tipo corretto

– delete distrugge l’oggetto e libera spazio– esempi:TypeName *typeNamePtr; crea puntatore a un oggetto di tipo TypeName

typeNamePtr = new TypeName; crea un oggetto di tipo TypeName, e ritorna un puntatore

Page 37: Capitolo 7: Classi (parte II)

37

2000 Prentice Hall, Inc. All rights reserved.

– esempidelete typeNamePtr; chiama il distruttore per un oggetto di tipo TypeName

delete [] arrayPtr; usato per cancellare dinamicamente un array

Inizializzare oggettidouble *thingPtr = new double(3.14159); inizializza un oggetto di tipo double a 3.14159

int *arrayPtr = new int[10]; crea un array di 10 interi

Page 38: Capitolo 7: Classi (parte II)

38

2000 Prentice Hall, Inc. All rights reserved.

6. Membri staticClassi membro static

– condivise da tutti gli oggetti di una classe (normalmente ogni oggetto ha la sua copia di ogni variabile)

– efficienti quando serve una sola copia di un dato (solo la variabile stati è modificata)

– Simili alle variabili locali, ma sono accessibili solo dagli oggetti della stessa classe

– esistono anche se non ci sono istanze (oggetti) della classe– variabili e funzioni possono essere static– possono essere public, private or protected

Page 39: Capitolo 7: Classi (parte II)

39

2000 Prentice Hall, Inc. All rights reserved.

Variabili static– accessibili da ogni oggetto– alle variabili public static si accede usando lo scope

resolution operator(::) Employee::count

– alle variabili private static si accede via una funzione membro public static

(To call a public static member function combine the class name, the :: operator and the function name Employee::getCount() )

Page 40: Capitolo 7: Classi (parte II)

40

2000 Prentice Hall, Inc. All rights reserved.

Funzioni Static– funzioni membro static non possono accedere a dati o

funzioni non-static– non c’è il puntatore this per le funzioni static che

esistono indipendentemente dall’oggetto

Page 41: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline41

Outline1 // Fig. 7.9: employ1.h

2 // An employee class

3 #ifndef EMPLOY1_H

4 #define EMPLOY1_H

5

6 class Employee {

7 public:

8 Employee( const char*, const char* ); // constructor

9 ~Employee(); // destructor

10 const char *getFirstName() const; // return first name

11 const char *getLastName() const; // return last name

12

13 // static member function

14 static int getCount(); // return # objects instantiated

15

16 private:

17 char *firstName;

18 char *lastName;

19

20 // static data member

21 static int count; // number of objects instantiated

22 };

23

24 #endif

1. Class definition

1.1 Function prototypes

1.2 Declare variables

function membro e variabile static.

Page 42: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline42

Outline

1. Load header file

1.1 Initialize static data members

1.2 Function definitions

25 // Fig. 7.9: employ1.cpp26 // Member function definitions for class Employee27 #include <iostream>2829 using std::cout;30 using std::endl;3132 #include <cstring>33 #include <cassert>34 #include "employ1.h"3536 // Initialize the static data member37 int Employee::count = 0;3839 // Define the static member function that40 // returns the number of employee objects instantiated.41 int Employee::getCount() { return count; }4243 // Constructor dynamically allocates space for the44 // first and last name and uses strcpy to copy45 // the first and last names into the object46 Employee::Employee( const char *first, const char *last )47 {48 firstName = new char[ strlen( first ) + 1 ];49 assert( firstName != 0 ); // ensure memory allocated50 strcpy( firstName, first );5152 lastName = new char[ strlen( last ) + 1 ];53 assert( lastName != 0 ); // ensure memory allocated54 strcpy( lastName, last );5556 ++count; // increment static count of employees

il dato membro count e la funzione membro getCount( ) sono inizializzati a file scope (required).

Nota assert per testare se la memoria è allocata.

count è cambiato dal costruttore.

Page 43: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline43

Outline

1.2 Function definitions

57 cout << "Employee constructor for " << firstName58 << ' ' << lastName << " called." << endl;59 }6061 // Destructor deallocates dynamically allocated memory62 Employee::~Employee()63 {64 cout << "~Employee() called for " << firstName65 << ' ' << lastName << endl;66 delete [] firstName; // recapture memory67 delete [] lastName; // recapture memory68 --count; // decrement static count of employees69 }7071 // Return first name of employee72 const char *Employee::getFirstName() const73 {74 // Const before return type prevents client from modifying75 // private data. Client should copy returned string before76 // destructor deletes storage to prevent undefined pointer.77 return firstName;78 }7980 // Return last name of employee81 const char *Employee::getLastName() const82 {83 // Const before return type prevents client from modifying84 // private data. Client should copy returned string before85 // destructor deletes storage to prevent undefined pointer.86 return lastName;87 }

Count decremented because of destructor calls from delete.

count è cambiato dal distruttore.

Page 44: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline44

Outline

1. Initialize objects

2. Function calls

3. Print data

88 // Fig. 7.9: fig07_09.cpp89 // Driver to test the employee class90 #include <iostream>9192 using std::cout;93 using std::endl;9495 #include "employ1.h"9697 int main()98 {99 cout << "Number of employees before instantiation is "100 << Employee::getCount() << endl; // use class name101102 Employee *e1Ptr = new Employee( "Susan", "Baker" );103 Employee *e2Ptr = new Employee( "Robert", "Jones" );104105 cout << "Number of employees after instantiation is "106 << e1Ptr->getCount();107108 cout << "\n\nEmployee 1: "109 << e1Ptr->getFirstName()110 << " " << e1Ptr->getLastName()111 << "\nEmployee 2: "112 << e2Ptr->getFirstName()113 << " " << e2Ptr->getLastName() << "\n\n";114115 delete e1Ptr; // recapture memory116 e1Ptr = 0;117 delete e2Ptr; // recapture memory118 e2Ptr = 0;

se non esiste nessun oggetto Employee , getCount deve essere acceduto usando class name e ::

Number of employees before instantiation is 0

e2Ptr->getCount() o Employee::getCount().

Employee constructor for Susan Baker called.

Employee constructor for Robert Jones called.

Number of employees after instantiation is 2

Employee 1: Susan Baker

Employee 2: Robert Jones

~Employee() called for Susan Baker

~Employee() called for Robert Jones

count incrementatodalla chiamata di new.

Page 45: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline45

Outline

Program Output

119

120 cout << "Number of employees after deletion is "

121 << Employee::getCount() << endl;

122

123 return 0;

124}

Number of employees before instantiation is 0Employee constructor for Susan Baker called.Employee constructor for Robert Jones called.Number of employees after instantiation is 2 Employee 1: Susan BakerEmployee 2: Robert Jones ~Employee() called for Susan Baker~Employee() called for Robert JonesNumber of employees after deletion is 0

count back to zero.

Page 46: Capitolo 7: Classi (parte II)

46

2000 Prentice Hall, Inc. All rights reserved.

7. Data Abstraction e Information Hiding

Information hiding – le classi nascondono i dettagli di implementazione– esempio: stack

• elementi aggiunti (pushed) e rimossi (popped) dal top• last-in, first-out (LIFO) data structure• non importa come lo stack è implementato, ma solo la filosofia LIFO

Abstract data types (ADTs)– modellamo oggetti reali (int, float sono modelli per i numeri)

C++ è estensibile– i tipi standard non possono essere cambiati, ma possono essere

creati nuovi tipi

Page 47: Capitolo 7: Classi (parte II)

47

2000 Prentice Hall, Inc. All rights reserved.

Esempio: dato astratto queueQueue

– filosofia FIFO– Enqueue (mette elementi in coda uno alla volta, dal bottom)– Dequeue (rimuove gli elementi dalla coda, uno alla volta, dal

top)

Queue ADT– clients non dovrebbero manipolare direttamente la struttura– solo le funioni memmbro della coda possono accedere ai dati

interni

Page 48: Capitolo 7: Classi (parte II)

48

2000 Prentice Hall, Inc. All rights reserved.

8. Classi container e iteratoriContainers

– disegnate per contenere collezioni di oggetti– forniscono servizi come inserimento, cancellazione, ricerca,

test sugli oggetti, ordinamento– esempi: array, stack, queue, tree e linked lists

Iteratori– oggetti che restituiscono il successivo elemento di una

collezione– è possibile avere più iteratori per container– ogni iteratore mantiena la propria informazione sulla

posizione

Page 49: Capitolo 7: Classi (parte II)

49

2000 Prentice Hall, Inc. All rights reserved.

9. Classi proxy• Proxy class

– Used to hide implementation details of a class– Class that knows only the public interface of the class being

hidden– Enables clients to use class’s services without giving access to

class’s implementation

• Forward class declaration– Used when class definition only uses a pointer to another class– Prevents the need for including the header file– Declares a class before it is referenced– Format:

class ClassToLoad;

Page 50: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline50

Outline

1. Implementation class definition----------------------1. Forward class declaration1.1 Interface class definition

1 // Fig. 7.10: implementation.h

2 // Header file for class Implementation

3

4 class Implementation {

5 public:

6 Implementation( int v ) { value = v; }

7 void setValue( int v ) { value = v; }

8 int getValue() const { return value; }

9

10 private:

11 int value;

12 };

13 // Fig. 7.10: interface.h14 // Header file for interface.cpp15 class Implementation; // forward class declaration1617 class Interface {18 public:19 Interface( int );20 void setValue( int ); // same public interface as21 int getValue() const; // class Implementation22 ~Interface();23 private:24 Implementation *ptr; // requires previous 25 // forward declaration26 };

Implementation has private data we want to hide.

Forward class declaration.

Proxy class Interface has same public interface as class Implementation.

Only uses a pointer to class Implementation. This allows us to hide the implementation details.

Page 51: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline51

Outline

1. Load header files

1.1 Function definitions-------------------------1. Load interface header file

1.1 Initialize objects

2. Function calls

3. Output

27 // Fig. 7.10: interface.cpp28 // Definition of class Interface29 #include "interface.h"30 #include "implementation.h"3132 Interface::Interface( int v ) 33 : ptr ( new Implementation( v ) ) { }3435 // call Implementation's setValue function36 void Interface::setValue( int v ) { ptr->setValue( v ); }3738 // call Implementation's getValue function39 int Interface::getValue() const { return ptr->getValue(); }4041 Interface::~Interface() { delete ptr; }42 // Fig. 7.10: fig07_10.cpp43 // Hiding a class’s private data with a proxy class.44 #include <iostream>4546 using std::cout;47 using std::endl;4849 #include "interface.h"5051 int main()52 {53 Interface i( 5 );54 55 cout << "Interface contains: " << i.getValue() 56 << " before setValue" << endl;57 i.setValue( 10 );58 cout << "Interface contains: " << i.getValue() 59 << " after setValue" << endl;60 return 0;61 }

Implementation file interface.cpp contains member functions for proxy class Interface. It is the only file that has header file implementation.h, which contains class Implementation.

interface.cpp is precompiled and given with the header file interface.h. The client cannot see the interactions between the proxy class and the proprietary class.

Only the header Interface.h — no mention of class Implementation. The client never sees the private data.

Page 52: Capitolo 7: Classi (parte II)

2000 Prentice Hall, Inc. All rights reserved.

Outline52

Outline

Program Output

Interface contains: 5 before setValInterface contains: 10 after setVal