indice degli [[appunti3s:linguaggio_c|appunti sulla programmazione in C++]]
====Funzioni membro====
Per capire cosa sia una funzione membro si deve __prima__ vedere l'esempio [[appunti3s:esempio_di_programmazione_orientata_agli_oggetti]]
Nei prossimi paragrafi si vedranno tre caratteristiche delle funzioni membro:
- 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.
====Puntatore this====
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 visibilità __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.
void preleva(ContoCorrente& c, int soldi); // dichiarazione della funzione, usando reference
preleva(mioConto,30); // chiamata della funzione