C e C++ hanno alcune differenze (approfondimento), oltre a qualche sottigliezza, l'aspetto principale è l'uso delle classi, che si ripercuotono sul cosiddetto "paradigma di programmazione":
- C: linguaggio procedurale
- C++: linguaggio orientato agli oggetti
Tuttavia, un concetto molto simile alle classi è quello dei dati strutturati. Infatti anche in C ad esempio posso scrivere:
typedef struct{
char nome[10];
int eta;
}persona;
In un certo senso, concettualmente ho creato un "oggetto"! Cosa cambia rispetto alle classi? Nelle classi potrei definire una funzione all'interno dell'oggetto stesso.
Tuttavia, c'è una soluzione anche per questo: sebbene sia magari un po' meno ordinato, posso comunque creare una funzione esterna all'oggetto (dato strutturato in questo caso), siccome non è una classe e quindi non consente di avere una funzione all'interno della struttura; la funzione può essere comunque spefica, se decidiamo che in input prenda solo un dato strutturato di quel tipo. Ad esempio, nel caso "persona" supponiamo si voglia stampare a video la sua età: ebbene, creo semplicemente una funzione di questo tipo:
vood stampa(persona p1){
//variabile p1 di tipo "persona"
printf("%d\n",p1.eta);
}
Quindi, nonostante sia leggermente "più disordinato", anche in C posso programmare ad oggetti! Almeno a questo livello, eventualmente se si parla di ereditarietà fra le classi, tramite puntatori si può comunque trovare una soluzione anche in quel caso.
Oggi il C++ è molto diffuso per varie ragioni (tuttavia, anche C continua ad esserlo, è insuperabile in alcuni ambiti, vedi approfondimento: efficienza linguaggio C rispetto ad altri linguaggi), abbiamo visto comunque un modo per trattare gli oggetti anche con il linguaggio C, che di per sé non lo prevedeva.
Vediamo ora un esempio di codice completo, con i commenti al codice per comprendere:
#include <stdio.h>
#include <stdlib.h>
//dato strutturato
typedef struct{
int x,y;
}dato;
//dichiarazione funzine
void f(dato *d1);
int main(){
dato d;
//inizializzazione
d.x=2;
//chiamo la funzione (passaggio parametri per riferimento, non per valore!!)
f(&d);
//stampa di verifica, OK!
printf("%d\n",d.x);
return 0;
}
//corpo della funzione
void f(dato *d1){
d1->x+=1;
}