La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.

Presentazioni simili


Presentazione sul tema: "Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria."— Transcript della presentazione:

1 Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria Informatica, Gestionale e dellAutomazione

2 Lezione 2 Regole di visibilità e ciclo di vita

3 Visibilità di una variabile Il campo dazione o spazio di visibilità di una variabile (scope) indica la parte di programma che può accedere alla variabile per leggerla o modificarla La visibilità è limitata al blocco (racchiuso tra parentesi graffe) in cui la variabile è dichiarata

4 Visibilità in C++ Il C++ supporta tre tipi di visibilità: Locale La parte di programma che costituisce la definizione di una funzione definisce un campo di visibilità separato Di namespace La parte di programma non contenuta nella dichiarazione o definizione di una funzione o di una classe Lo scope del namespace più esterno è detto scope globale Di classe Interno alla definizione di una classe

5 Esempio // scope globale int a1 = 3; int a2 = 4; int b1 = 9; int b2 = 11; double distanza(int x1, int y1, int x2, int y2) { // scope locale double dx = x2 - x1; double dy = y2 - y1; return sqrt(dx*dx + dy*dy); } int main() { std::cout << distanza(a1, a2, b1, b2) <<std::endl; system("pause"); return 0; }

6 Esempio: errori e precisazioni double distanza(int x1, int y1, int x2, int b1) { double dx = a2 – a1; // errore: non è accessibile double dy = b1 - y1; // parametro, non b1 del main return sqrt(dx*dx + dy*dy); } int main() { int a1 = 3; int a2 = 4; int b1 = 9; int b2 = 11; std::cout << distanza(a1, a2, b1, b2) <<std::endl; system("pause"); return 0; }

7 Ciclo di vita Il ciclo di vita di una variabile è il periodo compreso tra la sua creazione e la sua eliminazione Nasce quando la variabile viene associata ad una locazione di memoria Muore quando la locazione di memoria ritorna libera e riutilizzabile La vita di una variabile inizia quando viene dichiarata e finisce con la parentesi graffa di chiusura del suo blocco di visibilità

8 Esempio int main() { int a = 5; // a nasce if (a > 3) { int b = 7; // b nasce; a = b * b; a++; } // b muore cout << a; cout << b; // errore: b non è pù visibile } // a muore

9 Ciclo di vita e scope Se una variabile è viva, non vuol dire che sia visibile dalla porzione di codice in esecuzione ad un dato istante Una variabile locale può esistere in più istanze contemporaneamente Tutte le istanze sono vive, ma solo una è visibile

10 Esempio int fattoriale(int n) { int f1 = 1; if (n > 1) f1 = fattoriale(n - 1); return f1 * n; } int main() { int a = 3; cout << fattoriale(4); } Dentro fattoriale, a è viva ma non visibile Vengono successivamente create 3 istanze di f1 (corrispondenti alle chiamate ricorsive di fattoriale )

11 Oggetti e funzioni globali Una funzione dichiarata nel campo dazione globale è una funzione globale Una variabile dichiarata nel campo dazione globale è un oggetto globale Il ciclo di vita di un oggetto globale inizia allavvio del programma e termina alla fine del programma One Definition Rule (ODR): funzioni e oggetti globali possono essere definiti una sola volta

12 Definizioni La definizione di una funzione le fornisce un corpo, racchiuso tra parentesi graffe int calcola(int a, int b); // solo dichiarazione int maggiore(int x, int y) { // definizione if (x > y) return x; return y; } La definizione di un oggetto ha due possibili forme ; // senza inizializzazione = ;

13 Oggetti locali La dichiarazione di una variabile nel campo dazione locale introduce un oggetto locale Ci sono 3 generi di oggetti locali: Automatici Vivono dalla chiamata della funzione in cui sono definiti fino al ritorno dalla funzione register Oggetti automatici per i quali viene richiesta al compilatore una memorizzazione veloce Statici Risiedono in uno spazio di memoria che rimane riservato per lintera vita del programma

14 Oggetti automatici Occupano uno spazio di memoria che viene allocato al momento della chiamata della funzione in cui sono dichiarati Se non vengono inizializzati, hanno un contenuto che dipende da cosa era memorizzato in precedenza in quella locazione di memoria Lo spazio di memoria a loro dedicato viene liberato in automatico al termine della funzione

15 Oggetti register Dichiarati con la parola chiave register La dichiarazione suggerisce al compilatore di ottimizzarne laccesso per uso frequente Nella maggior parte dei compilatori moderni, è inutile e ridondante

16 Oggetti locali statici Dichiarate con la parola chiave static Durano lintera esecuzione del programma Sono inizializzate la prima volta che lesecuzione del programma passa attraverso la loro dichiarazione Se non inizializzate esplicitamente, vengono inizializzate a 0 Vengono usate quando il valore di una variabile non deve andar perso alla fine dellesecuzione di una funzione ma deve poter essere riutilizzabile

17 Esempio int uso_frequente(int a) { static int count; count++; if (count == 1000) std::cout << "Complimenti, lei è il millesimo cliente!" << std::endl; return a * 3; }

18 Ciclo di vita e visibilità delle variabili statiche Una variabile statica definita allinterno di una funzione Ha lo stesso ciclo di vita di una variabile globale Viene distrutta solo quando il programma termina Ha la stessa visibilità di una variabile locale

19 Definizioni di namespace I namespace (compreso il namespace globale) possono contenere altri namespace annidati Le entità definite in un namespace sono membre del namespace I nomi dei membri del namespace sono composti da :: :: è loperatore di scope Ci si può riferire ai membri del namespace globale con ::

20 Esempi int a1 = 3; int f() { int a = 3; return ::a1 * a; // uso di una variabile del namespace globale } namespace n1 { int a; int g() { // definzione dentro il namespace return 2; } int h(); } int n1::h() { // definizione fuori dal namespace return 3; }

21 Uso dei namespace Generalemente, in un programma si pongono Le dichiarazioni dei membri di un namespace in un file header Le definizioni dei membri in un file di implementazione Si possono utilizzare i mebri di un namespace includendo lheader e utilizzando loperatore di scope #include std::cout << test1; Si può rendere visibile un membro di un namespace con la direttiva using #include using std::cout; cout << test2;

22 Uso dei namespcae (cont.) Si possono rendere visibili tutti i membri di un namespace con a direttiva using namespace: #include using namespace std; cout << test3; Si può utilizzare un namespace tramite un alias #include namespace predefinito = std; predefinito::cout << test3;


Scaricare ppt "Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria."

Presentazioni simili


Annunci Google