feed
top
crea forum
cerca
feed
forum
supporto
discussione
cerca
È soltanto un
Pokémon con le armi
o è un qualcosa di più? Vieni a parlarne su
Award & Oscar!
JEHOVA e la NUOVA GERUSALEMME > INIZIO <
Blog libero tutti possono commentare nella zona chiacchiere tutti possono dire la sua , la CHAT è libera tutti possono usarla
Cerca
INDICE Appunti sulla programmazione C++
Accedi
09 ) Puntatori e allocazione dinamica della memoria new e delete e overloading, funzione operator#()
Messaggi
OFF
LINE
JehovaZorobabele
Post: 257
Post: 246
Registrato il: 02/03/2016
Registrato il: 03/03/2016
Sesso: Maschile
0
0
28/07/2016
17:01
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
Visualizza l'intera discussione
1
5
MediaObject
1,63
26
1
Tag discussione
puntatori
bympt-zorobabele
allocazione memoria
cpp programmazione
programmazione cpp
programmazione ad oggetti
overloading
funzione operator
new delete allocazione
Registrati
Accedi
INDICE Appunti sulla programmazione C++
Accedi
IL MIO PROFILO
LE MIE DISCUSSIONI
FORUM CHE SEGUI
LA MIA FORUM-CARD
MODIFICA FORUM-CARD
FAQ
TRADUCI
LOGOUT
Accedi
Registrati
FAQ
TRADUCI
Scatta o carica foto
Allega file
Inserisci link da url (card)
Incorpora url (YouTube/Twitter/...)
ACCETTA
RIFIUTA
Anteprima