07) Le classi il costruttore e il distruttore eredità

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
JehovaZorobabele
00mercoledì 29 giugno 2016 18:04
Costruttori distruttori, classe protette publiche private overloading eredità


Con la nuova struttura che è la classe si è desiderato volutamente far fronte hai problemi che il C aveva un esempio il C non prevedeva di riunire tutti i dati in un file header anche se era consigliato oppure una volta usata quella funzione il programma apriva nuove funzioni senza fare della pulizia della vecchia struttura invocata,  con il C++ si ha l’ incapsulamento tutti i dati importanti sono inseriti dentro una classe, che costruisce e elimina questi dati vediamo il costruttore



 La classe stessa invocata  tramite il compilatore crea  in automatico il costruttore, il costruttore
prende il nome della stessa classe  appena creata  il costruttore è una funzione normale che non ha nessun tipo di ritorno questa nuova funzione può servire per inizializzare le variabili,  quando si chiama un oggetto della classe il compilatore stesso crea in silenziosità la chiamata di scope per quella stessa classe  (lo scope come abbiamo visto era ::  ora il compilatore chiama la classe e il suo costruttore e crea il ponte tramite il puntatore nascosto this  che è una parola riservata dove produce la chiamata di scope come se fosse un normale puntatore , il puntatore dentro la
struttura struct chiamava i suoi membri tramite il comando -> ora questa chiamata
viene fatta di nascosto )



Il costruttore è come qualsiasi funzione solo che porta il nome della stessa classe ma non ha un valore di ritorno come  il distruttore, che per inizio porta la tilde ~ sia il costruttore che il
distruttore vengono creati nell’ area pubblica della classe in modo che possono
essere richiamati  :



class
nome {
int a;
public:
nome();      // costruttore
~nome()    //distruttore
};



Il distruttore garantisce che all’ uscita della classe tutto sia distrutto (distrutto un modo per dire ,viene cancellata la zona utilizzata dalla classe in modo che quella zona usata possa essere riutilizzata) cosi ci appropriamo della memoria utilizzata



Nel costruttore possiamo inizializzare le nostre variabili e usarla come una normale funzione possiamo anche caricare le funzioni inline che significa se abbiamo funzioni semplici possiamo direttamente sviluppare la nostra funzione dentro la stessa classe esempio:


#include<iostream>
using namespace std;

class somma {
 int x,y;
public:

somma(int a, int b ) { x=a ; y=b ;}
//
costruttore con in più la funzione inline dentro la stessa classe, che inizializza le variabili private  x, y in modo da utilizzarle  con la funzione  (vedi) qui sotto, ugualmente questa funzione è sviluppata inline  dentro la stessa classe 

 void vedi () {cout << “a= “ <<a <<” + “<<” b= “<< b  <<“ Somma = ” <<a+b <<endl;

}; // fine della classe 



  int main () { //inizio programma 

   somma  x  (9 , 11) ;

// somma che è la classe crea l’ oggetto x e passa i
valori al costruttore somma era possibile 
// scrivere anche     somma x = somma(9, 11); normalmente si usa il primo metodo più veloce 


    x.vedi();   

//ora nell’ oggetto x. non esiste il nome del costruttore (somma) per questo è stato tutto creato su 
system(“pause”) ; }



Utilizzando le funzioni costruttore con i parametri, logicamente meno funzioni vanno in
circolo più efficiente è il programma inoltre utilizzare le funzioni inline e utilizzare i costruttori come funzioni normali è molto comune Ricordiamo che anche new e delete sono costruttore e distruttore dell’ area utilizzata dai puntatori , tanto sia il Puntatore che la Classe o una variabile sono oggetti che devono essere costruiti e distrutti al limite vengono tutti distrutti con
la chiusura del programma 



Con  questo nuovo compilatore del C++, è stato eliminato il problema delle variabili, con il compilatore C  le variabili locali o automatiche   dovevano essere tutte definite all’ inizio
del blocco appena sotto  int main (), ora in C++ possiamo e dobbiamo definire le stesse variabili vicino dove le usiamo e possibilmente meglio anche inizializzarle  int i=0; cosi siamo sicuri che questa variabile ( int i) non contiene cifre spazzatura dovuta all’ esistenza di altri dati prima di questi poi si può capire meglio la funzionalità delle varie variabili e ci guadagna anche la leggibilità  se con il vecchio compilatore  abbiamo definito 100 variabili sotto il main vai a trovare quale variabile è la nostra a meta di circa 5000 righe di codice scritto in C , poi ricordiamoci in C++ le variabili posso essere riutilizzate se usciamo da un ciclo  di { } bisogna
stare attenti alle variabili globali che non devono mai essere denominate come
quelle automatiche in quel caso si può avere il compilatore in errore non sa cosa prendere la locale int  a; oppure la globale int a ;  bisogna fare attenzione anche i blocchi annidati tipo if di non usare sempre le stesse variabili con i stessi nomi per uguali variabili  , se sono diverse char a; , double a;  e int a; il compilatore capisce le differenze anche se tutte si chiama a ma hanno
un formato diverso e qui si parla di overloading 



L’ overloading, risolve un problema perché non fare in modo che quando si crea oggetti (variabili o funzioni) non può essere buono quel nome  per tutti i tipi, ovvero se io devo stampare  una somma sia in float che in intero la stessa somma anziché chiamarle con un nome differente,
ora   posso utilizzare la somma float e somma int  sempre  con lo stesso nome per la stessa funzione deve essere il compilatore che capisce la differenza risolvendo questo problema Stroustrup ha risolto anche un altro problema del C dove è possibile usare una funzione senza prima essere stata dichiarata e molte volte il programma in esecuzione può dare errori , con il C++questo problema è stato risolto con i file header.h che se non ci sono ora il compilatore non compila e da errori come già detto i file header serve per quando si utilizza le strutture (class o struct union ) poi inoltre è possibile che si definisce una funzione  void a(int) {} poi quando è dichiarata è  un float   void a(float);  il nuovo compilatore questi errori li segnala mentre il vecchio C non diceva nulla era possibile anche non dichiarare nulla pertanto non faceva confronti come fa il compilatore C++



Un altro fattore molto importante del C++ è l’ eredità con l’ eredità è possibile passare delle
informazioni da strutture a strutture infatti questo lavoro incorpora una classe dentro un’ altra classe dello stesso tipo  per farlo bisogna scrivere il nome della nuova classe : tipo accesso  il nome della vecchia classe { esempio  classe nuova “nuovo” e classe vecchia “vecchio”  il tipo di accesso bisogna dire che tipo è pubblic o private protected :



class nuovo : public vecchio {



In questo caso tutti l’ elementi pubblici della vecchia classe base  “vecchio” sono pubblici anche qui dentro la nuova classe “nuovo” di solito quando si parla di eredità la vecchia classe viene disegnata come classe base o classe genitore ancora superclasse  mentre la nuova si chiama classe derivata o classe figlia ancora sottoclasse, quest’ultima classe può essere anche lei una
base per una nuova classe ora vediamo i vari sistemi d’uso dei tipi d’accesso



 Se su una struttura derivata non viene inserito il tipo d’ accesso sarà considerato quello modello secondo la struttura  se è una classe  è private se è una struct sarà “public :” con questo
ultimo modello tutti i membri pubblici della struttura base o genitore  diventeranno membri pubblici della struttura derivata o figlia  , mentre tutti i membri  protetti “protected :” della classe genitore diventeranno membri protetti  anche nella classe figlia, inoltre per i
membri privati “private :”della struttura padre rimarranno privati e non saranno accessibile dalla classe figlia e quando nella struttura viene indicata con un entrata per private tutti i
membri pubblici ,  privati e protetti non saranno accessibili dentro la struttura padre pertanto il compilatore da errore sottolineando in rosso le funzioni chiamate ma protette mentre nella struttura figlia i componenti public possono essere usati



Con la nuova parola riservata protected indica una eredità diversa da private e da
public se in una struttura viene dichiarato protetto , i membri di questa struttura saranno accessibili solo da membri che fanno parte della stessa struttura i membri protetti possono accedere ai membri privati.   Se la classe padre è ereditata come pubblic i stessi membri protected di qui saranno protetti anche nella classe figlia e pertanto sono raggiungibili anche dalla  sottoclasse in sintesi con protected possiamo ereditare e trattare  tutti i dati sia essi protetti che privati logicamente i dati privati vengono richiamati tramite le funzioni pubbliche altrimenti sono inaccessibili poi vedremo meglio tutte queste cose  una classe figlia può ereditare da più classi padre vedremo ….


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

Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 12:28.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com