Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
appunti3s:funzioni_membro [2017/07/09 11:59]
profpro
appunti3s:funzioni_membro [2018/04/25 07:55] (current)
Line 1: Line 1:
 < < indice degli [[appunti3s:​linguaggio_c|appunti sulla programmazione in C++]] < < indice degli [[appunti3s:​linguaggio_c|appunti sulla programmazione in C++]]
  
-====== Funzioni membro ======+====Funzioni membro==== 
 +Per capire cosa sia una funzione membro si deve __prima__ vedere l'​esempio [[appunti3s:​esempio_di_programmazione_orientata_agli_oggetti]]
  
-All'​interno di una classedi solito, sono dichiarate le principali funzioni che operano sui dati di quella ​classe. Queste funzioni sono dette funzioni membro, vedere esempio nella classe ContoCorrente+Nei prossimi paragrafi si vedranno tre caratteristiche delle funzioni membro: 
-Il costruttore,​ il distruttore sono casi particolari di funzioni membro ​che vengono studiate a parte.+  - disponibilità del puntatore this 
 +  - visibilità nel namespace della classe di definizione 
 +  - accesso a tutti i dati membro della classe ​(anche private) 
 +Le funzioni membro ​static invece non hanno il puntatore this.  
 +Le funzioni ​friend possono accedere ai membri private pur non essendo ​membro.
  
-Le funzioni membro della classe ContoCorrente possono essere chiamate solo tramite un oggetto di tipo ContoCorrente,​ col la seguente sintassi: +====Puntatore this====
-Vedere anche codice sorgente di {{:​appunti3s:​contocorrente1.zip|ContoCorrente.cpp}} +
-<​code>​ +
-ContoCorrente mioConto(); ​ // creo l'​oggetto mioConto +
-mioConto.preleva(30); ​     // chiamo la funzione membro</​code> ​+
  
-====== ​Funzioni esterne ​======+Quando si invoca una funzione membro (col il punto su un oggetto) viene creato automaticamente un puntatore a quell'​oggetto su cui è stato invocata la funzione.  
 +All'​interno della funzione è quindi possibile accedere a tale oggetto senza bisogno di doverlo passare come argomento. Lo strumento messo automaticamente a disposizione di ogni funzione membro per accedere a tale oggetto è il puntatore //this//. 
 + 
 +===== Incapsulamento delle funzioni===== 
 +L'​incapsulamento (encapsulation) è un concetto che spiega come, riducendo l'​accoppiamento del codice nel programma, si riesce ad aumentare la facilità di manutenzione e di riutilizzo. Per esempio, facendo in modo che alcune parti del codice possano essere utilizzabili solo da altre parti del codice. 
 +==== Data hiding ==== 
 +Con //data hiding//, un caso particolare di incapsulamento,​ si spiega che l'​isolamento del codice si può ottenere anche diminuendo la //​visibilità//​ e //​l'​accessibilità//​ delle variabili usate da alcune parti di codice. Il data hiding può essere realizzato usando le classi, infatti esse hanno un duplice effetto: 
 +  - definiscono un namespace che ha lo stesso nome della classe, quindi possono esistere elementi omonimi in diverse classi. Vedere [[appunti3s:​programmazione_multifile#​namespace]] 
 +  - permettono di usare uno specificatore di accesso che può ridurre l'​accessibilità,​ come //private// (default) (le //struct// invece no...). 
 + 
 +==== Specificatori di accesso ==== 
 +Esistono tre //​specificatori di accesso//:  
 +  * //​public//​ 
 +  * //​protected//​ 
 +  * //​private//​ 
 +Lo specificatore di **accesso** è seguito da //due punti// (:) e modifica la <​del>​visibilità</​del>​ __accessibilità__ di tutto quello che lo segue. 
 +=== public: === 
 +Quando un elemento viene dichiarato usando //public//, significa che vi può accedere chiunque. 
 +=== private: ===  
 +Quando un elemento viene dichiarato usando //​private//,​ significa che vi si può accedere solo all'​interno della struttura/​classe dove è stato dichiarato. Quindi, possono accedere ai dati private di una classe solo le sue funzioni membro. 
 +=== protected: === 
 +È usato nella composizione tra classi, come nell'​[[appunti3s:​ereditarietà]] 
 +==== Esempio ==== 
 + 
 +Come nell'​esempio {{appunti3s:​contocorrente1.zip}},​ la classe ContoCorrente possiede il membro //private// mSaldo: questo significa che è visibile solo dalle funzioni membro della propria classe e non da quelle di altre classi. Chiunque voglia conoscere il contenuto di mSaldo, o voglia modificarlo,​ deve farlo usando le funzioni membro (pubbliche) di ContoCorrente. Questo spiega il segno - (negativo) e + (positivo) a sinistra degli elementi della classe ContoCorrente. Alcune delle funzioni sono //​private//,​ ma almeno una di loro (come il costruttore) sarà //public// altrimenti la classe diventa inutilizzabile. 
 + 
 +==== Funzioni esterne ​====
  
 Altre volte le funzioni potrebbero essere definite anche fuori della classe, ma poi, per operare su un determinato oggetto, diventa necessario passare l'​oggetto attraverso i reference. In tal caso si può scrivere. Altre volte le funzioni potrebbero essere definite anche fuori della classe, ma poi, per operare su un determinato oggetto, diventa necessario passare l'​oggetto attraverso i reference. In tal caso si può scrivere.
Line 19: Line 46:
 <​code>​void preleva(ContoCorrente&​ c, int soldi); // dichiarazione della funzione, usando reference</​code>​ <​code>​void preleva(ContoCorrente&​ c, int soldi); // dichiarazione della funzione, usando reference</​code>​
 <​code>​preleva(mioConto,​30); ​               // chiamata della funzione</​code>​ <​code>​preleva(mioConto,​30); ​               // chiamata della funzione</​code>​
- 
  • appunti3s/funzioni_membro.1499594397.txt.gz
  • Last modified: 2018/04/25 11:11
  • (external edit)