Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 21 di 93
  • livello avanzato
Indice lezioni

Metodi o funzioni membro

Definire i metodi di una classe in linguaggio C++, ed utilizzare correttamente le parole chiave static, const, inline e friend.
Definire i metodi di una classe in linguaggio C++, ed utilizzare correttamente le parole chiave static, const, inline e friend.
Link copiato negli appunti

Il costrutto di classe, introdotto nelle lezioni C++ precedenti, costituisce il fulcro della programmazione orientata agli oggetti grazie alla sua peculiarità di combinare in un'unica entità dati e comportamenti.

Questa lezione introduce proprio questi ultimi, che nell'ambito della definizione di classi, sono rappresentati da entità dette metodi o funzioni membro, per distinguerli dal costrutto di funzione generica che abbiamo trattato in precedenza.

I costruttori, il distruttore e gli operatori di assegnamento sono tutti esempi di funzioni membro soggetti ad alcuni vincoli particolari data la peculiarità del compito cui sono deputati.

In generale una classe può contenere un numero arbitrario di funzioni membro, ognuna con una sua utilità specifica nell'ambito del modello concettuale che abbiamo delineato. Da un punto di vista meramente sintattico, non esistono differenze significative tra la definizione di una funzione e di una funzione membro di classe.

Tuttavia, sussistono differenze sostanziali che ne riguardano l'ambito di visibilità, nella duplice veste di visibilità della funzione membro in quanto simbolo nel flusso di istruzioni che compone il nostro programma, e di simboli che sono visibili all'interno del corpo della funzione stessa in quanto membro di classe.

Tali differenze, salvo casi particolari che tratteremo nel seguito, sono così riassumibili:

  • l'invocazione di una funzione membro è diversa dall'invocazione di una funzione generica, in quanto essa è sostanzialmente legata alla presenza di una istanza della classe di appartenenza;
  • i dati cui una funzione membro ha accesso non si limitano ai parametri di input ed alle variabili localmente definite nel corpo della funzione, ma includono tutti i membri della classe di appartenenza.

La comprensione di tali caratteristiche è imprescindibile per una corretta applicazione del paradigma di programmazione orientata agli oggetti.

Funzioni membro e programmazione a oggetti

Introducendo il costrutto di funzione, si è fatto cenno al concetto di incapsulamento. Nella programmazione orientata agli oggetti, l'importanza di questo principio consiste nella possibilità di mascherare i dettagli implementativi di una classe.

Introducendo il costrutto di classe abbiamo menzionato l'esistenza di differenti livelli di accesso per i membri di classe (pubblico, protetto e privato) entro i quali sono ascrivibili sia i dati che le funzioni membro.

Assegnare il corretto livello di accesso ad una funzione membro è importante per diversi motivi. Un metodo pubblico può essere invocato al di fuori del contesto della classe. Alterare la firma di un metodo pubblico (nome, argomenti e tipo restituito) quindi ha effetto in ogni parte del codice in cui esso è invocato, anche al di fuori della classe di appartenenza.

Non si può conoscere a priori la portata e le conseguenze di tale modifica sul codice, soprattutto se non siamo gli unici utenti della classe, ad esempio quando scriviamo una libreria.

Scegliere il corretto livello di accesso risulta comunque solitamente immediato in fase di progettazione del nostro modello concettuale, soprattutto se si cerca di privilegiare la definizione di classi "snelle" e con un'interfaccia minimale, che espongano solo le funzioni membro strettamente necessarie per l'uso.

L'esempio seguente mostra una classe d'esempio con una sola funzione membro, definita nella sezione pubblica, e la sua implementazione:

// test.h
class Test
{
public:
void incrementX(int a);
protected:
int x;
}
// test.cpp
#include "test.h"
void Test::incrementX(int a)
{
x = x + a;
}

La funzione incrementX() è invocabile da ogni istanza della classe Test in ogni contesto, ed all'interno del suo corpo è possibile usare sia i parametri che fanno parte della sua firma, come a, sia i membri della classe Test, siano essi dati membro o altri metodi.

In C++, tuttavia, esistono anche altre clausole che consentono di definire ulteriormente il comportamento di una funzione membro e che si applicano mediante l'uso di appositi qualificatori. Esse sono tutte correlate a vario titolo con il concetto di incapsulamento, poiché alterano le regole generali di visibilità discusse in precedenza.

Nelle lezioni successive approfondiremo l'uso di tali qualificatori nell'ambito della definizione delle funzioni membro e più avanti, vedremo come alcuni di questi qualificatori si applicano anche ai dati membro, con le dovute differenze semantiche.

Ti consigliamo anche