LA NUOVA GERUSALEMME
Qui si costruisce la NUOVA GERUSALEMME grazie al SECONDO TESTIMONE e UNTO, GESU' vi aveva avvisati del mio arrivo ovvero l'arrivo del FIGLIO dell'UOMO, Gesù stesso ha detto che non lo vedete mai più da Giovanni 16,10 "LA GIUSTIZIA" da cui leggiamo ( 10La giustizia sta dalla mia parte, perché torno al Padre e non mi vedrete più.) Lui stesso manda lo Spirito Santo che è il VERO Figlio dell' Uomo . Il vero Figlio dell' Uomo è descritto in Apocalisse 1, 12 ecc.. Io uso la Bibbia Interconfessionale, diversamente cito altri testi. >>> Pace e Bene dal Figlio dell'Uomo <<<
 
Pagina precedente | 1 | Pagina successiva

09 ) Puntatori e allocazione dinamica della memoria new e delete e overloading, funzione operator#()

Ultimo Aggiornamento: 28/07/2016 17:01
Autore
Vota | Stampa | Notifica email    
OFFLINE
Post: 257
Post: 246
Registrato il: 02/03/2016
Registrato il: 03/03/2016
Sesso: Maschile
28/07/2016 17:01
 
Quota

Vediamo New e delete vediamo loverloading delle funzioni una piccola vista sulla funzione operator#()
In C c’era l’ operatori e funzioni malloc ()e free() che allocava la memoria dinamica ancora oggi sono supportate per compatibilita con il vecchio C ora ci sono 2 nuovi operatori new e delete rispettivamente serve per allocare e dislocare la memoria, new assegna un area di memoria e restituisce un puntatore all’ inizio di quest’area di memoria, cosi new vuole il nome del puntatore e il tipo che è questo puntatore, per tipo si intente se si lavora su un intero un float ecc… pertanto con int *pu; puntatore ad interi avremo da scrivere semplicemente :


pu = new int ;


diversamente possiamo anche dichiarare il puntatore direttamente :


int *pu = new int;


ora abbiamo assegnato un’area di memoria per il puntatore pu di tipo int usata questa memoria tocca al programmatore cancellare quest’aria di memoria con delete, per cancellare la memoria si scrive lo stesso nome del puntatore variabile che abbiamo usato nel nostro caso pu :


delete pu;


Quando utilizziamo il delete si deve cancellare solo quella parte di memoria che abbiamo utilizzato con new, se indichiamo altro facilmente il computer va in tilt con un blocco di sistema, non si può usare new e delete con free e malloc insieme nello stesso programma , comunque new e delete elimina l’ errori di malloc e free pertanto usare solo new e delete con new si può utilizzare l’ inizializzazione del puntatore con un valore uguale al tipo che abbiamo allocato , usiamo il nostro pu puntatore e gli diamo un valore di 100 ora pu vale 100 :


pu new= int(100);


Prima di usare new e delete bisogna includere il file header new #include<new>, poi bisogna vedere se l’ allocazione della memoria va a buon fine o meno perché potrebbe capitare che la stessa memoria non basti per consentire l’allocazione , cosi la chiamata ad new non viene consentita cosi si genera una eccezione bad_alloc gestione proprio gestita dal file header <new> per gestire l’eccezione bisogna controllare il puntatore con le funzioni dell’ eccezioni che vedremo in seguito per ora try è per la gestione delle eccezioni catch cattura i tipi di eccezione in questo momento il tipo di eccezione è il bad_alloc ovvero errore di allocazione della memoria :


Try { pu = new int } catch (bad_alloc xa) { cout << "Errore di allocazione \n" ; return 1;}


Con new possiamo allocare memoria anche con gli array perché il formato di new è anche :


puntatore = new tipo_array[dimensione] ; esempio : int *pu = new int [5];

pu il nome del puntatore è un array da 5 elementi, per cancellare la memoria occupata dall’ array scrivere : delete [] pu; le quadre dice che si deve liberare la memoria occupata da un array



Possiamo creare una nuova allocazione anche per gli oggetti delle strutture esempio creiamo una nuova classe :


class classe{…..};


definiamo il puntatore *pclasse per la struttura di tipo classe


classe *pclasse;


poi in pclasse si assegna il puntatore al 3 indirizzo, di [10] oggetti di tipo classe, per poi allocare la memoria nello spazio di memoria heap ovvero nella memoria totale abbiamo assegnato questo spazio per tipo classe


pclasse = new classe [10] +3;


Come visto su in caso di fallimento con l’ assegnamento della memoria, oppure se abbiamo da modificare i programmi in C che usano il malloc , new può essere usato diversamente con il comando nothrow ecco la sintassi del comando new :

int *pu = new(nothrow)int ;

nothrow evita di creare le eccezioni con try ma effettua lui il controllo ecco un esempio :



pu = new (nothrow) int;


if (!pu) { cout <<"errore di allocazione " ; return 1;} ecc….


altro modo di usare new con la parola (location) al posto di (nothrow), (location) è utilizzata quando si usa l’ overlaiding di new in casi particolari che vedremo prossimamente


Per overloading come già preannunciato è l’ uso di uno stesso nome per più di una funzione quello che cambia sono solo i tipi possiamo avere 3 funzioni somma ma quello che cambia sono i parametri ma non il nome della funzione il compilatore sa quale funzione deve prendere grazie i parametri o tipo che sceglie posso avere una somma per interi , una somma per i double ecc..la differenza non deve essere solo nei dati che restituisce ma nei dati che prende poi dichiarare un puntatore su una funzione void funzione( *pu); e void funzione( pu[] ); è la stessa cosa perché il puntatore è l’ inizio dell’ array


Il motivo per cui è nato l’ overloading, cosi il programmatore può avere più scelta nel creare diversi tipi di funzioni esempio le funzioni costruttore che può sfruttare diversi metodi di risolvere il problema e avere più elasticità e avere la possibilità di creare oggetti diversi ovvero funzioni inizializzate o meno, oppure con l’ overloading è possibile costruire i costruttori di copie senza usare la stessa area di memoria


L’unica cosa veramente importante quando si usa l’ overloading è che le funzioni in uso non devono essere ambigue per il compilatore deve saper scegliere quale funzione deve prendere e questo quando si crea una funzione non deve essere dubbia nella scelta come scrivere una funzione area poi alla fine il compilatore deve scegliere che area dobbiamo calcolare dato che sia per un rettangolo che per un triangolo inserisco sempre base e altezza il compilatore capisce la differenza tra numeri interi e numeri reali poi un area di 2,53 con un’area di 3 o di 2 è ben diverso dobbiamo noi capire cosa dobbiamo usare, quando si fa una divisione è difficile che esce un numero intero


Parlando di overloading possiamo avere un sistema con la funzione operator#() che serve per fare l’ overloading delle funzioni membro delle classi la sintassi della funzione operator è:


tipo_restituito nome_classe::operator#(argomenti) { operazioni}


La parte interessante di questa funzione è il cancelletto # li si deve inserire un operatore che può essere un(+ - * / = ++ -- == < > >> << <= += -= &= &) , come possiamo intuire con 4 funzioni simili possiamo avere un stesso nome questo sistema si chiama overloading degli operatori , la funzione operator risolve le specifiche operazione che dovranno essere svolte, nella parte tipo_restituito normalmente è l’ oggetto della classe di solito è il costruttore della classe stessa, ma può essere qualsiasi tipo valido, con l’ operatore unario (operatore unario agisce solo su un unico operando tipo & * ++ o --) l’ elenco argomenti deve rimanere vuoto , mentre su gli operatori binari (operatore binario agisce su 2 operandi tipo + - * / ) in questo caso deve contenere un solo parametro perché l’ operando sinistro (left) viene passato alla funzione operator indirettamente dal puntatore this , che ha un effetto fondamentale infatti con l’ overloading degli operatori binari l’oggetto di sinistra genera la chiamata alla funzione operator#() per vedere con quali tipi di operatori si può adattare vedete nella guida del C++ la parola (operator(parola chiave)[C++] ) li vi spiega quali operatori sono unari e binari cosi conoscete se la funzione deve rimanere con un solo argomento oppure deve rimanere vuoto , comunque l’ argomento potrebbe diventare l’ operatore di chiamata della stessa funzione


Questa funzione operator#() ci permette di creare una nuova operazione usando gli oggetti della classe stessa come facciamo a=a+b ; possiamo fare le stesse operazioni con l’ oggetti delle classe, visto che di questi metodi e funzione operator#() ; tutti hanno inserito pochi accenni e tanto meno esempi per capire la lasciamo un po’ indietro poi se ci servirà faremo un appendice secondaria trovando più testi chi è interessato al discorso può trovare in internet con google ( c++ funzione operator) esce testi di molte università gran parte spiega poco e solo teoria con qualche esempio isolato e sempre uguale sembra copiato


Ciao grazie da ByMpt-Zorobabele

Testo PDF aggiornato con questo ultimo capitolo inserito lo trovate : http://www.freeforumzone.com/d/11266858/Elenco-figure-dei-comandi-della-programmazione-C-TESTO-PDF/discussione.aspx



Anche qui di queste discussioni che inserisco faccio un testo PDF da poter scaricare tutto il mio materiale è da utilizzare come desiderate per il testo PDF vedi cartella dedicata , ogni volta cambia ubicazione del testo allora cambio il file e il testo lo inserisco dentro la cartella < file aggiornato ad oggi >

http://www.freeforumzone.com/d/11266858/Elenco-figure-dei-comandi-della-programmazione-C-TESTO-PDF/discussione.aspx

Vota: 15MediaObject1,63261
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi

Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Crea forum gratis, gestisci la tua comunità! Iscriviti a FreeForumZone
FreeForumZone [v.6.1] - Leggendo la pagina si accettano regolamento e privacy
Tutti gli orari sono GMT+01:00. Adesso sono le 06:23. Versione: Stampabile | Mobile
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com