< < 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