I membri e le restrizioni di accesso

Documenti analoghi
Sommario. Le strutture Le classi

Lezione 4. Costruttori

Const, friend, static,this

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Introduzione al polimorfismo. Il polimorfismo è la possibilità di utilizzare una unica interfaccia per più metodi

Ereditarietà gerarchica

Laboratorio di Algoritmi e Strutture Dati

Capitolo 5 - Funzioni

A.A. 2006/2007 Laurea di Ingegneria Informatica. Fondamenti di C++ Horstmann Capitolo 3: Oggetti Revisione Prof. M. Angelaccio

La programmazione ad oggetti (OOP)

Il C nel C++: Funzioni

Cenni sul preprocessore e il suo utilizzo

Il paradigma OO e le Classi

Capitolo 10 - Strutture

Template (1) Molte volte l operato di una funzione o le proprietà di una classe non dipendono dal tipo dei dati coinvolti

Tipi di Dati Astratti

Le direttive del Preprocessore

Visibilità e tempo di vita delle variabili

Funzioni, Stack e Visibilità delle Variabili in C

La classe std::vector della Standard Template Library del C++

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Programmazione orientata agli oggetti. Ivan Lanese

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

STRUTTURA DI UN PROGRAMMA

Corso di Programmazione ad Oggetti

La sintassi del C APPENDICE H

Università degli Studi di Cassino Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili

strutturare dati e codice

Introduzione C++ Il compilatore. La compilazione in g++ Introduzione a C, C++ e Java. C++ C Java 1977 C 1986 C++ Compilatori Librerie Usare oggetti

Introduzione all uso delle funzioni in C++

Laboratorio di programmazione

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

Programmazione ad oggetti

Implementazione dell albero binario in linguaggio C++

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Introduzione alle classi 2

OCA JAVA 8 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Bloodshed Dev-C++ Bloodshed Dev-C++ è l IDE usato durante le esercitazioni/laboratorio. IDE = Integrated Development Environment. Codice corso: 21012

Ottenere una modifica del parametro attuale

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Esempio Principio di sostituibilità

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

Lezione 13 Classi interne

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 31 Ottobre 2014

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Strategie di programmazione

Algoritmo di ordinamento per scambio (a bolle o bubble sort)

Le classi. Costruttori

Strutture Dati. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Strutture Dati 1 / 16

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Il preprocessore. Direttiva define Direttiva include Direttiva if

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Modularizzazione del software

Il linguaggio C. Notate che...

Corso di Programmazione I. Riferimenti. Il ciclo di sviluppo dei programmi. La programmazione modulare in C++ Fondamenti di Informatica I

INPUT: 2 parametri. double atan2( double y, double x) OUTPUT: risultato del calcolo. Le funzioni. Implementazioni di funzioni dell utente

Lezione 6 Introduzione al C++ Mauro Piccolo

Esercizi. Cosa fa questa linea di codice: while (*a++=*b++); Costruiamo una funzione che la utilizzi (hint. Usiamo I char..)

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Funzionalità. Il preprocessore C. Inclusione di file. Inclusione di file

Introduzione al linguaggio C Puntatori

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

Informatica! Appunti dal laboratorio 1!

Esercitazione n 2. Obiettivi

Corso di Fondamenti di Informatica

Istruzioni semplici e strutturate

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Corso di Programmazione a oggetti

Classi di memorizzazione

Linguaggio C: PUNTATORI

Passaggio parametri puntatore

Introduzione all OOP!

Le basi del linguaggio Java

Laboratorio di Algoritmi e Strutture Dati

Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

I numeri razionali. Specifica: la sintassi. Specifica: la semantica

I/O FILE. Sommario I/O FILE. I/O FILE LETTURA DA FILE DI TESTO oggetto di tipo ifstream. I/O FILE: lettura e scrittura su file di testo

C# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate

Capitolo 3 Sviluppo di Programmi Strutturati

Matrici. Matrici.h Definizione dei tipi. Un po di esercizi sulle matrici Semplici. Media difficoltà. Difficili

3) Descrivere l architettura di un elaboratore tramite astrazione a livelli

Perché il linguaggio C?

4. Accesso diretto per gli archivi con record a lunghezza costante

Primi passi col linguaggio C

Dal C al C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Qualsiasi programma in C++ segue lo schema:

Transcript:

I membri e le restrizioni di accesso

Sommario I membri Le restrizioni di accesso Separazione interfaccia da implementazione

Accedere ai membri di una classe La visibilità dall'esterno dei dati e delle funzioni membro di una classe dipende dalle restrizioni imposte All interno di una classe tutti i membri sono visibili e accessibili tramite il proprio nome Le variabili definite all interno di una funzione membro sono visibili solo alla funzione stessa In caso di nomi coincidenti fra variabili locali ad una funzione membro e dati membro si deve ricorrere all operatore :: per accedere al dato membro Per accedere dall esterno si usano gli stessi operatori di accesso usati per le struct. e ->

Accedrere ai dati membro // Simple class Count class Count { public: int x; void print() { cout << x << endl; ; int main(){ Count counter, // create counter object *counterptr = &counter, // pointer to counter &counterref = counter; // reference to counter cout << "Assign 7 to x and print using the object's name: "; counter.x = 7; // assign 7 to data member x counter.print(); // call member function print cout << "Assign 8 to x and print using a reference: "; counterref.x = 8; // assign 8 to data member x counterref.print(); // call member function print cout << "Assign 10 to x and print using a pointer: "; counterptr->x = 10; // assign 10 to data member x counterptr->print(); // call member function print return 0;

Il controllo dell accesso E possibile controllare l accesso che viene consentito ai dati ed alle funzioni membro di una classe I possibili tipi di controllo sono: pubblico privato protetto (vedremo in seguito) Tutti i dati e le funzioni dichiarate dopo lo specificatore public: sono ad accesso pubblico Tutti i dati e le funzioni dichiarate dopo lo specificatore private: sono ad accesso privato

Accesso di tipo public Lo scopo dei membri public è di presentare al client di una classe una interfaccia di servizi disponibili I dati e le funzioni public sono accessibili a tutte le altre funzioni del programma

Accesso di tipo private I membri private sono accessibili solo alle funzioni membro di tale classe Non è possibile per alcuna funzione esterna accedere ai dati o funzioni private di una classe

Sintassi La modalità di accesso di default è private Tutti i membri elencati nell intestazione di una classe dall inizio al primo specificatore esplicito sono considerati private Dopo ogni specificatore la modalità indicata si applica a tutti i membri fino allo specificatore successivo o al termine della definizione della classe

Restrizione di accesso Vale sempre il principio del minimo privilegio: Consentire il livello necessario di accesso e niente di più Nella maggior parte dei casi: i dati membro dovrebbero essere privati le funzioni membro dovrebbero essere pubbliche funzioni membro di servizio (utilizzate da altre funzioni membro pubbliche) dovrebbero essere private

Restrizioni default In una struct la modalità di accesso di default è public Una struct in C++ è una classe che logicamente non dovrebbe possedere funzioni membro, ma sintatticamente non ci sono limitazioni In realta' una struct o una classe in C++ sono equivalenti a meno della modalita' di accesso di default

Funzioni di utilità Non tutte le funzioni membro devono essere pubbliche per essere utili Se una funzione esegue dei compiti necessari ad altre funzioni membro allora può essere resa private ed essere unicamente utilizzata all interno delle altre funzioni Ad esempio: le funzioni predicative come isempty() o isvalid() che controllano la verità o falsità di una condizione

Esempio di funzione di utilità: class Tempo{ public: Tempo(); void set(int, int); void stampa(); void stampa_secondi(); private: int ora; int min; E usata in una funzione int converti_sec(); membro ma non serve ; renderla accessibile all esterno void Tempo::stampa_secondi(){ int sec=converti_sec(); cout<< Secondi da mezzanotte: <<sec<<endl; int Tempo::converti_sec(){ return min*60+ora*3600; Funzione di servizio

Separazione interfaccia implementazione Un principio fondamentale di buona ingegneria del software è separare l interfaccia dall implementazione Per ottenere: modifiche più facili cambiamenti all implementazione trasparenti al client Tutto quello che deve sapere un programma client è contenuto nelle dichiarazioni public di una classe; L implementazione delle funzioni e tutto ciò che è private può essere cambiato in modo trasparente senza dover effettuare alcuna modifica sul programma client

Divisione in più file La dichiarazione di una classe va in un header file che il software client include se vuole usare la classe (ex. Tempo.h) Le definizioni delle funzioni membro vanno in un file sorgente che viene collegato in fase di link dal compilatore (ex. Tempo.cpp) In questo modo i venditori di software possono rilasciare gli header con le interfaccie e le definizioni in forma di programmi oggetto

Il problema delle dichiarazioni multiple Se si vuole compilare un programma sorgente si deve fornire la dichiarazione delle variabili, funzioni e classi e la loro definizione Se si vuole utilizzare una variabile, funzione o classe definita altrove in un programma e' sufficiente che il programma ne conosca la dichiarazione Successivamente in fase di link verra' collegata la definizione vera e propria...ma quando si collegano i due compilati (il programma e la definizione della funzione) si hanno due dichiarazioni Non e' mai possibile avere due definizioni della stessa entita' (perche' non si riesce a decidere quale usare)

L'inclusione condizionale La direttiva di preprocessore #ifndef e #define permettono di evitare l inclusione ripetuta dello stesso file Usando #ifndef var si accede alla parte rimanente solo nel caso in cui non sia mai stata definita var Ma l'istruzione successiva definisce proprio var In questo modo la prima volta che si incontra #ifndef si includera' la definizione mentre la seconda volta no Si dovrebbe sempre utilizzare questa tecnica Si consiglia di definire costanti dal nome mutuato dal file a cui si riferiscono Es. TIME_H da Time.h

Inclusione Condizionale

Esempio: File time1.h #ifndef TIME1_H #define TIME1_H // Time abstract data type definition class Time { public: Time(); // constructor void settime( int, int, int ); // set hour, minute, second void printmilitary(); // print military time format void printstandard(); // print standard time format private: int hour; // 0-23 int minute; // 0-59 int second; // 0-59 ; #endif

Esempio: File time1.cc // Member function definitions for Time class. #include <iostream> #include "time1.h" // Time constructor initializes each data member to zero. // Ensures all Time objects start in a consistent state. Time::Time() { hour = minute = second = 0; // Set a new Time value using military time. Perform validity // checks on the data values. Set invalid values to zero. void Time::setTime( int h, int m, int s ) { hour = ( h >= 0 && h < 24 )? h : 0; minute = ( m >= 0 && m < 60 )? m : 0; second = ( s >= 0 && s < 60 )? s : 0;

Esempio: File time1.cc // Print Time in military format void Time::printMilitary() { cout << ( hour < 10? "0" : "" ) << hour << ":" << ( minute < 10? "0" : "" ) << minute; // Print time in standard format void Time::printStandard() { cout << ( ( hour == 0 hour == 12 )? 12 : hour % 12 ) << ":" << ( minute < 10? "0" : "" ) << minute << ":" << ( second < 10? "0" : "" ) << second << ( hour < 12? " AM" : " PM" );

Esempio: File main.cc #include <iostream> #include "time1.h" int main(){ Time t; // instantiate object t of class time cout << "The initial military time is "; t.printmilitary(); cout << "\nthe initial standard time is "; t.printstandard(); t.settime( 13, 27, 6 ); cout << "\n\nmilitary time after settime is "; t.printmilitary(); cout << "\nstandard time after settime is "; t.printstandard(); t.settime( 99, 99, 99 ); // attempt invalid settings cout << "\n\nafter attempting invalid settings:\n" << "Military time: "; t.printmilitary(); cout << "\nstandard time: "; t.printstandard(); cout << endl; return 0;

Esempio: File salesp.h // SalesPerson class definition // Member functions defined in salesp.cpp #ifndef SALESP_H #define SALESP_H class SalesPerson { public: SalesPerson(); // constructor void getsalesfromuser(); // get sales figures from keyboard void setsales( int, double ); // User supplies one month's // sales figures. void printannualsales(); private: double totalannualsales(); // utility function double sales[ 12 ]; // 12 monthly sales figures ; #endif

Esempio: File salesp.cc #include "salesp.h" // Member functions for class SalesPerson // Constructor function initializes array SalesPerson::SalesPerson() { for ( int i = 0; i < 12; i++ ) sales[ i ] = 0.0; //Function to get 12 sales figures from the user at the keyboard void SalesPerson::getSalesFromUser() { double salesfigure; for ( int i = 1; i <= 12; i++ ) { cout << "Enter sales amount for month " << i << ": "; cin >> salesfigure; setsales( i, salesfigure );

Esempio: File salesp.cc // Function to set one of the 12 monthly sales figures. // Note that the month value must be from 0 to 11. void SalesPerson::setSales( int month, double amount ){ if ( month >= 1 && month <= 12 && amount > 0 ) sales[month-1]=amount;//adjust for subscripts 0-11 else cout << "Invalid month or sales figure" << endl; // Print the total annual sales void SalesPerson::printAnnualSales(){ cout << setprecision( 2 ) << setiosflags( ios::fixed ios::showpoint ) << "\nthe total annual sales are: $" << totalannualsales() << endl; // Private utility function to total annual sales double SalesPerson::totalAnnualSales(){ double total = 0.0; for ( int i = 0; i < 12; i++ ) total += sales[ i ]; return total;

Esempio: File main.cc #include "salesp.h" int main() { SalesPerson s; // create SalesPerson object s s.getsalesfromuser(); // note simple sequential code s.printannualsales(); // no control structures in main return 0;