User Tools

Site Tools


appunti3s:funzioni_membro

Differences

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

Link to this comparison view

Next revision
Previous revision
appunti3s:funzioni_membro [2013/06/17 21:07] – external edit 127.0.0.1appunti3s:funzioni_membro [2020/06/08 22:19] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +< < 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 <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.
 +
 +
 +<code>void preleva(ContoCorrente& c, int soldi); // dichiarazione della funzione, usando reference</code>
 +<code>preleva(mioConto,30);                // chiamata della funzione</code>