Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Reference online:
http://www.cppreference.com/index.html
http://www.cplusplus.com/ref/
Il primo programma C++
#include <iostream>//direttiva
preprocessore <,> o “”
using namespace std;//abbreviazione
utilizza variabili etc definite in std
int main()
{
cout << “Ciao mondo” <<
endl;//std::cout prompt dei comando
//<< operatore di scrittura
return 0; //programma termina correttamente
solo se viene restituito 0
}
CiaoMondo.cpp
Il primo programma C++
L'esecuzione dei programmi inizia dalla funzione
main()
Le graffe{ e } delimitano blocchi di codice (in questo
caso il corpo della funzione main()
All'interno di un blocco i singoli statement sono
terminati da un ;
/* e */ delimitano i commenti. Si può usare
anche //
Il primo programma C++
if (cond) {
blocco 1
} else {
blocco 2 con == 0
} d
!= 0
do {
blocco
} while (cond); con
!= 0
d
== 0
Controllo di flusso: for
for (inizializzazione; cond; step) {
blocco
}
for (;;) {
cout << “Infinito” << endl;
con == 0 }
d
!= 0 Equivale a
inizializzazione;
blocco while (cond) {
blocco;
incremento;
}
step
Controllo di flusso: break e
continue
L’istruzione break interrompe l’attuale istruzione
di iterazione (for, while, do...while).
StdioTests.cpp
I tipi di dato base: interi
int Intero “standard della macchina”, in genere 32 bit
short Intero “corto”, in genere 16 bit
long Intero “lungo”, in genere 32 bit
char Carattere, in genere 8 bit
long long Intero “molto lungo”, in genere 64 bit (non standard)
I tipi interi possono essere con o senza segno. Il default è con segno
(tranne che per i char dove è dipendente dal compilatore). Per
specificare un intero senza segno si usa la keyword unsigned. Ad es:
unsigned long intero lungo senza segno
Per indicare esplicitamente che un intero è con segno si usa la keyword
signed. //default con segno
Anche bool, che può assumere solo i valori true e false è “quasi” un
intero
I tipi di dato base: virgola mobile
float precisione singola IEEE (32 bit, 23 di mantissa e 8 di
esponente) //1 bit di segno
double precisione doppia IEEE (64 bit, 52 di mantissa e 11 di
esponente)
long double precisione estesa (non standard, 80 bit, 68 di mantissa
e 11 di esponente)
http://www.math.grin.edu/~stone/courses/fundamentals/IEEE-reals.html
I tipi di dato base: enumeration
Permette di definire delle costanti intere con nome simbolico
enum colori { //tipo di dato
nero, //a ciascuna etichetta viene assegnato
//un valore numerico dal compilatore
rosso = 1,
verde,
giallo,
bianco = 255
};
Il valore può essere implicito, nel qual caso viene assunto essere uguale
al valore precedente più 1 o a zero nel caso del primo valore.
Definizione di variabili
In C++ le variabili si definiscono facendole precedere dal loro tipo
Si possono definire più variabili dello stesso tipo assieme, separandole
con una virgola
Si può inizializzare una variabile assegnandole un valore al momento
della definizione.
int contatore;
double importo1, importo2;
unsigned long zero = 0, due = 2;
// contatore, importo, importo2 = ??
int vettore[71];
conto ilMioConto;
// ...
ilMioConto.saldo = 1000000; // Magari :)
I puntatori Pointers.cpp
Un puntatore è un riferimento, ovvero punta ad un indirizzo di memoria che
può contenere un dato di base o un dato aggregato
In C++ l'uso dei puntatori è sempre esplicito, attraverso l'operatore asterisco
(*) o l'operatore freccia (->)
Per ricavare l'indirizzo di una variabile si usa l'operatore e commerciale (&)
I nomi degli array sono già implicitamente dei puntatori
int *vptr = vettore; //vettore di 70 elementi dichiarato
precedentemente, vptr punta al primo elemento del vettore
*vptr = 0; // vettore[0] = 0
vptr = &vettore[12]; //sposto il puntatore
*vptr = 144; // vettore[12] = 144
contoPtr->saldo = 1000000; //accedo all'elemento saldo e
scrivo
NB (*contoptr).saldo == contoptr->saldo
int *pv = &v[0]; // Stessa cosa che int *pv = v;
Aritmetica dei puntatori
Ai puntatori si possono sommare e sottrarre quantità intere per spostarli
di un certo numero di posizioni in memoria
pippo.c pluto.c
extern bool foo(int a, int
b); bool foo(int a, int b)
int main() {
{ return true;
return foo() ? 0 : 1; }
}
g++/gcc
Programma (o eseguibile)
Classi di memorizzazione: auto
Le variabili di classe auto (il default) sono allocate sullo stack
int main() {
return sum; // Restituisce 3
}
Dichiarazione e definizione
La dichiarazione indica soltanto il tipo dell'oggetto dichiarato (variabile,
tipo dati o funzione)
La definizione invece fornisce al compilatore tutte le informazioni
necessarie
In particolare la definizione di una variabile riserva lo spazio di memoria
per la variabile
Nota: la sintassi di dichiarazione e di definizione è un po' confusa
extern int i; // Dichiarazione di variabile che sarà definita
successivamente, di solito usata nei file .h (esempio funzioni di sistema cin o
cout)
int j; // Definizione
int k = 3; // Definizione con inizializzazione
La parola chiave extern viene usata solo per la dichiarazione, non per la
definizione.
Vengono anch'esse inizializzate una volta per tutte prima dell'esecuzione
di main()
extern int bigsum; // dichiarazione bigsum è definita da qualche altra parte
int sum = 3; // Definizione di sum
int main() {
return sum + bigsum; // Restituisce 3 + bigsum
}
Allocazione dinamica: l'heap
(mucchio)
È possibile utilizzare oggetti allocati in modo dinamico, ovvero
esplicitamente dal programmatore.
CommandLine.cc
io.cc
Object Oriented Programming: classi
}
//metodo particolare che si chiama come la classe è detto costruttore inizializza
l'oggetto
//il codice dopo : sono i membri mentre i valori nome_ sono passati dall'esterno,
inizializzo i membri con i valori passati dall'esterno
//orfano lo inizializzo all'interno della funzione
//il costruttore consente di inizializzare i dati nell'ordine in cui compaiono
nella definizione del tipo
private://Dati
string nome;
string cognome;
Persona *padre;
Persona *madre;
bool orfano;
};
class e visibilità
...e questa è una class perfettamente equivalente. Cambia soltanto
l'uso di public/private
class Persona
{
public:
Persona(string nome_, string cognome_, Persona *padre_, Persona *madre_)
: nome(nome_), cognome(cognome_), padre(padre_), madre(madre_)
{
orfano = (!padre || !madre);
}
private:
string nome;
string cognome;
const Persona *padre;
const Persona *madre;
const bool orfano;
};
Molta carne al fuoco
public significa che tutti i membri e metodi che seguono sono
accessibili anche da oggetti di altre classi o da codice non facente parte
di alcuna classe (ad es. dalla funzione main())
private invece significa che i membri e metodi che seguono non sono
accessibili da oggetti di altre classi o codice non facente parte di una
classe->sono accessibili dai metodi di una classe
Class0.cc
Ridefinire gli operatori
In C++ gli operatori del linguaggio (+, -, /, *, !, ecc) sono funzioni
come le altre
Si può quindi definire il codice che viene eseguito quando vengono
usati gli operatori.
Per far questo basta definire un metodo o una funzione di nome
operatorop dove op è uno degli operatori del linguaggio
class List {
public:
void append(const string &el) { /* ... */ }//metodo
List &operator += (const string &el) { append(el); return *this; }
//accetta una reference a stringa costante, appende la stringa alla lista
restituisce l'oggetto puntato da this cioè quello in cui si sta lavorando
};
costr_destr.cc
Ereditarietà
Una classe può derivare da un'altra. Caratteristiche della classe derivata:
La classe derivata comprende automaticamente tutti i membri dato e tutti
i metodi della classe base
Un puntatore (o reference) ad oggetto di classe derivata può essere
passato dovunque è richiesto un puntatore (o reference) alla classe base
(implicit downcast).//la classe derivata può essere usata in tutti i posti dove uso la
classe padre
//...
int m = max<int>(1, 2);//specifico che tipo di parametro deve
ricevere la funzione
int m = max(1, 2); // Solo in certi casi, nel caso passo 2.3 il
compilatore non sa quale tipo di cast effettuare
Mappa<string, int> mappa;
Standard Template Library
vector<string> v(10);//dichiarazione
v[9] = “Ultimo”;// assegnazione
STL: il tipo map