Funzioni statiche
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 4 di 61.
Quando suddividi il codice in più file, ogni funzione definita in un file sorgente è visibile per impostazione predefinita agli altri file. Ma a volte hai bisogno di funzioni di supporto da usare solo internamente: funzioni a cui gli altri file non dovrebbero accedere e di cui non dovrebbero nemmeno essere a conoscenza.
La parola chiave static, quando viene applicata a una funzione, ne limita la visibilità al file in cui è definita. Questo crea una funzione privata che non può essere chiamata da altri file sorgente, anche se qualcuno prova a dichiararla.
// math_utils.c
#include "math_utils.h"
// Funzione ausiliaria privata - visibile solo in questo file
static int square(int x) {
return x * x;
}
// Funzione pubblica - può essere chiamata da main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
In questo esempio, sum_of_squares è dichiarata nell’header e può essere usata ovunque. Tuttavia, square è contrassegnata come static, quindi esiste solo all’interno di math_utils.c. Se main.c prova a chiamare direttamente square(), il linker genererà un errore: la funzione semplicemente non esiste al di fuori del suo file.
Questo è il modo in cui C realizza l'incapsulamento a livello di file. Le funzioni statiche ti permettono di nascondere i dettagli di implementazione, mantenendo pulita la tua interfaccia pubblica e usando internamente la logica di supporto di cui hai bisogno.
Sfida
FacileCreiamo un calcolatore di distanza che usa una funzione di supporto privata per calcolare il quadrato di un numero: un dettaglio che dovrebbe rimanere nascosto al resto del programma.
Creerai tre file:
distance.h: il tuo file header, che dichiara una sola funzione pubblicadistance_squaredche accetta quattro numeri interi (x1, y1, x2, y2), rappresentanti due punti, e restituisce un numero intero. Includi le protezioni contro le inclusioni multiple usando il simboloDISTANCE_H.distance.c: il tuo file sorgente contenente l'implementazione. Crea una funzione di supportostaticchiamatasquareche accetta un numero intero e ne restituisce il quadrato. Questa funzione di supporto dovrebbe essere visibile solo all'interno didistance.c. Poi implementadistance_squaredusando la funzione di supporto statica per calcolare (x2-x1)² + (y2-y1)².main.c: il tuo file principale, che include l'header e usa la funzione pubblica. La funzione di supportosquarenon dovrebbe essere accessibile qui: è disponibile solodistance_squared.
La funzione distance_squared calcola la distanza euclidea al quadrato tra due punti. Rendendo statica la funzione square, nascondi questo dettaglio di implementazione a tutto il codice che si trova al di fuori di distance.c.
Riceverai quattro valori interi in input: x1, y1, x2 e y2.
Stampa la distanza al quadrato in questo formato:
Squared distance: {result}Ad esempio, con i punti (0, 0) e (3, 4), l'output sarebbe:
Squared distance: 25Provalo tu
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: Chiama distance_squared con le coordinate inserite
// e stampa il risultato nel formato: "Squared distance: {result}"
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online