SlideShare una empresa de Scribd logo
1 de 45
Descargar para leer sin conexión
Il C++ in pillole
Corrado Santoro
ARSLAB - Autonomous and Robotic Systems Laboratory
Dipartimento di Matematica e Informatica - Universit`a di Catania, Italy
santoro@dmi.unict.it
L.A.P. 1 Course
Corrado Santoro Il C++ in pillole
C++: Definizioni e Sintassi Base
Corrado Santoro Il C++ in pillole
Il C++ `e ...
l’estensione del C con il supporto della programmazione ad
oggetti.
Ha le seguenti caratteristiche base:
Definizione di classi e oggetti.
Allocazione statica e dinamica degli oggetti.
Ereditariet`a singola e multipla.
Ereditariet`a virtual e non-virtual.
Overloading degli operatori.
Template (simili ai generics di Java).
Libreria run-time molto ricca (Standard Template Library -
STL).
Corrado Santoro Il C++ in pillole
C++: dichiarazione di classe
✞
class MyClass {
private:
// elenco dei membri (attributi e metodi) privati
protected:
// elenco dei membri (attributi e metodi) protetti
public:
// elenco dei membri (attributi e metodi) pubblici
} ; // <----- RICORDATEVI DEL ";" FINALE!!
✡✝ ✆
Esempio:
✞
class Point {
private:
int x, y;
public:
Point(int ax, int ay); // costruttore
int get_x();
int get_y();
} ;
✡✝ ✆
Corrado Santoro Il C++ in pillole
Modificatori di visibilit`a
public: il metodo o attributo `e visibile ovunque.
private: il metodo o attributo `e visibile solo all’interno
della stessa classe (default).
protected: il metodo o attributo `e visibile solo all’interno
della stessa classe e delle classi ereditate.
Corrado Santoro Il C++ in pillole
C++: dichiarazione e implementazione
A differenza di Java, in C++ esiste (come in C) una netta separazione
tra dichiarazione di classe e implementazione dei metodi.
La dichiarazione di classe riporta solo l’elenco degli attributi ed il
prototipo dei metodi.
L’ implementazione dei metodi `e fatta separatamente riportando la
definizione del metodo e, di seguito, il suo codice.
Il nome effettivo del metodo, specificato nell’implementazione, `e
formato dalla stringa nomeclasse::nomemetodo.
Corrado Santoro Il C++ in pillole
C++: dichiarazione e implementazione di classe
✞
class Point {
private:
int x, y;
public:
Point(int ax, int ay); // costruttore
int get_x();
int get_y();
} ;
Point::Point(int ax, int ay)
{
x = ax; y = ay;
}
int Point::get_x()
{
return x;
}
int Point::get_y()
{
return y;
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
C++: dichiarazione e implementazione di classe
E’ tuttavia possibile implementare un metodo direttamente nella
dichiarazione di classe (Java-style). In tal caso il metodo verr`a
trattato come inline.
✞
class Point {
private:
int x, y;
public:
Point(int ax, int ay); // costruttore
int get_x() { return x; };
int get_y() { return y; };
} ;
Point::Point(int ax, int ay)
{
x = ax; y = ay;
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Creazione e uso degli oggetti
✞
class Point {
private:
int x, y;
public:
Point(int ax, int ay); // costruttore
int get_x() { return x; };
int get_y() { return y; };
} ;
Point::Point(int ax, int ay)
{ x = ax; y = ay; }
int main(int argc, char **argv)
{
Point p(4,5); // creazione *statica* oggetto p di classe Point
printf("Point p = %d, %dn", p.get_x(), p.get_y());
}
✡✝ ✆
L’accesso ai metodi/attributi di un oggetto si effettua con la
notazione puntata.
p `e definito all’interno della funzione main e pertanto avr`a
visibilit`a e vita solo dentro main.
Appena la funzione terminer`a, p sar`a distrutto (stessa
semantica delle variabili C).
Corrado Santoro Il C++ in pillole
Un altro esempio
✞
#include <stdio.h>
class Point {
private:
int x, y;
public:
Point(int ax, int ay); // costruttore
int get_x() { return x; };
int get_y() { return y; };
Point add(Point p);
} ;
Point::Point(int ax, int ay)
{ x = ax; y = ay; }
Point Point::add(Point p)
{
Point ret_val(x + p.get_x(), y + p.get_y());
return ret_val;
}
int main(int argc, char **argv)
{
Point p1(4,5), p2(10,10);
Point p3 = p1.add(p2);
printf("Risultato = %d, %dn", p3.get_x(), p3.get_y());
}
✡✝ ✆
Compilazione: g++ file.cc -o file ...
Corrado Santoro Il C++ in pillole
Passaggio parametri, puntatori e reference
Corrado Santoro Il C++ in pillole
Semantica del passaggio di oggetti a metodi/funzioni
La semantica di passaggio dei parametri `e identica a quella
del C, cio´e i parametri (qualunque essi siano) vengono
passati sempre per copia.
Passare un oggetto a un metodo significa pertanto effettuarne
una copia.
✞
...
Point Point::add(Point p)
{
// p riceve *una copia* di p2 e *non lo stesso p2*
Point ret_val(x + p.get_x(), y + p.get_y());
return ret_val;
// nella fase di "return", p3 riceve una *copia* di ret_val,
// mentre ret_val viene distrutto alla conclusione del metodo add()
}
int main(int argc, char **argv)
{
Point p1(4,5), p2(10,10);
Point p3 = p1.add(p2); // <--- p2 viene *copiato* sulla variabile p del metodo add
printf("Risultato = %d, %dn", p3.get_x(), p3.get_y());
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Reference agli oggetti
Q: E’ possibile avere dei reference, cos`ı come in Java?
A: S`ı!, usando i puntatori e l’allocazione dinamica✞
#include <stdio.h>
class Point {
int x, y; // private per default
public:
Point(int ax, int ay); // costruttore
int get_x() { return x; };
int get_y() { return y; };
Point add(Point * p);
} ;
Point::Point(int ax, int ay)
{ x = ax; y = ay; }
Point Point::add(Point * p)
{
// p punta a p2; p2 e (*p) sono *LO STESSO OGGETTO*
Point ret_val(x + p->get_x(), y + p->get_y());
// dato che p risulta un *puntatore*, uso la notazione "->"
return ret_val;
}
int main(int argc, char **argv)
{
Point p1(4,5), p2(10,10);
Point p3 = p1.add(&p2); // <-- passo il *PUNTATORE* a p2
printf("Risultato = %d, %dn", p3.get_x(), p3.get_y());
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Puntatori e reference
In C++ `e possibile “nascondere” un puntatore usando una sintassi
che permette di specificare un tipo reference ad oggetto.
Di fatto `e un puntatore solo che `e nascosto (stessa semantica Java).
✞
class Point {
...
public:
...
Point add(Point & p);
} ;
...
Point Point::add(Point & p)
{
// p e p2 sono *LO STESSO OGGETTO*, il puntatore risulta ‘‘nascosto’’
Point ret_val(x + p.get_x(), y + p.get_y());
return ret_val;
}
int main(int argc, char **argv)
{
Point p1(4,5), p2(10,10);
Point p3 = p1.add(p2);
printf("Risultato = %d, %dn", p3.get_x(), p3.get_y());
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Allocazione Dinamica
Corrado Santoro Il C++ in pillole
Allocazione dinamica
E’ possibile allocare dinamicamente un oggetto usando
l’operatore new (equivalente al “malloc”) il quale restituisce
un puntatore all’oggetto.
Tuttavia ogni oggetto allocato dinamicamente dovr`a
essere esplicitamente distrutto usando l’operatore
delete (no garbage collection).
Ogni oggetto allocato dinamicamente esiste sempre fino
a che non `e distrutto esplicitamente da un delete.
Esempio: Point * p = new Point(3,4);
Corrado Santoro Il C++ in pillole
Allocazione dinamica
✞
#include <stdio.h>
class Point {
int x, y; // private per default
public:
Point(int ax, int ay); // costruttore
int get_x() { return x; };
int get_y() { return y; };
Point * add(Point * p);
} ;
Point::Point(int ax, int ay)
{ x = ax; y = ay; }
Point * Point::add(Point * p)
{
// alloco il risultato dinamicamente e ne restituisco il puntatore
Point * ret_val = new Point(x + p->get_x(), y + p->get_y());
return ret_val;
}
int main(int argc, char **argv)
{
Point p1(4,5), p2(10,10);
Point * p3 = p1.add(&p2);
printf("Risultato = %d, %dn", p3->get_x(), p3->get_y());
delete p3;
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Allocazione dinamica di array
E’ possibile usare gli operatori “new” e “delete” anche per
allocare dinamicamente/deallocare un array.
Allocazione di un array di tipo T:
T * a = new T[size];
Deallocazione di un array:
delete [] a;
Esempio: int * p = new int[300];
Corrado Santoro Il C++ in pillole
Costruttori e Distruttori
Corrado Santoro Il C++ in pillole
Costruttore e Distruttore
La gestione del ciclo di vita di un oggetto `e demandata al
programmazione che ne controlla sia la creazione che la
distruzione (implicita o esplicita).
Accanto al metodo speciale “costruttore” esiste dunque
anche un metodo speciale denominato distruttore che
viene invocato quando l’oggetto `e cancellato dalla
memoria.
✞
class Point {
int x, y; // private per default
public:
Point(int ax, int ay); // costruttore
˜Point(); // distruttore
int get_x() { return x; };
int get_y() { return y; };
Point * add(Point * p);
} ;
Point::˜Point()
{
// .. codice del distruttore
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Distruttore
L’uso del distruttore `e fondamentale per liberare eventuali
zone di memoria allocate dinamicamente dall’oggetto,
altrimento non verrebbero rilasciate (no garbage collection).
✞
class MyClass {
int * array;
public:
MyClass(int n); // costruttore
˜MyClass(); // distruttore
...
} ;
MyClass::MyClass(int n)
{
array = new int[n];
}
MyClass::˜MyClass()
{
delete [] array;
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Overloading Operatori
Corrado Santoro Il C++ in pillole
Overloading Operatori
Tutti gli operatori (artimetici, logici, relazionali, array
subscript []) posso essere ridefiniti sulla base del tipo dei
loro argomenti.
Esempio: considerando una classe Complex che
rappresenta un numero complesso, `e possibile ridefinire gli
operatori aritmetici in modo da poter scrivere un codice del
tipo:
✞
...
Complex a, b, c, d;
d = a + b * c;
...
✡✝ ✆
Corrado Santoro Il C++ in pillole
Overloading Operatori
Data un’espressione del tipo:
✞
Complex result, lhs, rhs;
result = lhs + rhs;
✡✝ ✆
Il comportamento dell’operatore “+” pu`o essere ridefinito in una
funzione o metodo chiamato operator+ con uno dei seguenti
prototipi:
✞
// FUNZIONI
Complex operator+(Complex lhs, Complex rhs);
Complex operator+(Complex &lhs, Complex rhs);
Complex operator+(Complex lhs, Complex &rhs);
Complex operator+(Complex &lhs, Complex &rhs);
✡✝ ✆
✞
// METODI DELLA CLASSE COMPLEX
Complex Complex::operator+(Complex rhs);
Complex Complex::operator+(Complex &rhs);
✡✝ ✆
Corrado Santoro Il C++ in pillole
Overloading Operatori: Esempio
✞
class Complex {
float re, im;
public:
Complex();
Complex(float r, float i);
void set(float r, float i) { re = r; im = i; };
float real() { return re; };
float imag() { return im; };
Complex operator+(Complex & p);
};
Complex::Complex()
{
re = 0; im = 0;
}
Complex::Complex(float r, float i)
{
this->re = r; this->im = i;
}
Complex Complex::operator+(Complex & p)
{
Complex result(re + p.re, im + p.im);
return result;
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Overloading Operatori: Esempio
✞
class Complex {
float re, im;
public:
Complex();
Complex(float r, float i);
void set(float r, float i) { re = r; im = i; };
float real() { return re; };
float imag() { return im; };
Complex operator+(Complex & p);
};
...
Complex Complex::operator+(Complex & p)
{
Complex result(re + p.re, im + p.im);
return result;
}
main()
{
Complex a(1,2), b(3,4);
Complex c = a + b;
printf("Risultato = %f,%fn", c.real(), c.imag());
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Overloading Operatori: Esempio 2
✞
class Complex {
float re, im;
public:
Complex();
Complex(float r, float i);
void set(float r, float i) { re = r; im = i; };
float real() { return re; };
float imag() { return im; };
};
...
Complex operator+(Complex & lhs, Complex & rhs)
{
Complex result(lhs.real() + rhs.real(), lhs.imag() + rhs.imag());
return result;
}
main()
{
Complex a(1,2), b(3,4);
Complex c = a + b;
printf("Risultato = %f,%fn", c.real(), c.imag());
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Overloading Operatori e Stream
L’overloading degli operatori permette d’uso di una sintassi
“elegante” quando occorre accedere ai file.
I file in C++ (cos`ı come in Java) sono virtualizzati tramite
oggetti di tipo stream.
Poich`a la console `e essa stessa un file, essa `e
virtualizzata tramite due oggetti:
cout, di tipo ostream (equivalente alla printf)
cin, di tipo istream (equivalente alla scanf)
Essi sono definiti nell’header iostream
Utilizzano gli operatori “>>” e “<<”
Corrado Santoro Il C++ in pillole
Stream e Cout: Esempio
✞
#include <iostream> // senza il .h, gli header file C++ non lo hanno
using namespace std;
// cout e cin sono definiti nel "namespace" std
// Lo "using" serve a impostare un prefisso di namespace,
// altrimenti occorrerebbe esplicitarlo
main()
{
cout << "Hello worldn";
}
✡✝ ✆
✞
#include <iostream> // senza il .h, gli header file C++ non lo hanno
using namespace std;
// cout e cin sono definiti nel "namespace" std
// Lo "using" serve a impostare un prefisso di namespace,
// altrimenti occorrerebbe esplicitarlo
main()
{
int a, b;
cout << "Inserisci due valori:";
cin >> a;
cin >> b;
cout << "Somma = " << (a + b) << "n";
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Polimorfismo
Corrado Santoro Il C++ in pillole
Polimorfismo
In C++ ogni metodo o funzione pu`o avere diverse forme
(implementazioni) che differiscono a seconda dei tipi e del numero di
parametri forniti.
✞
class Complex {
float re, im;
public:
Complex();
Complex(float r, float i);
void set(float r, float i) { re = r; im = i; };
void set(Complex &c) { re = c.real(); im = c.imag(); };
float real() { return re; };
float imag() { return im; };
Complex operator+(Complex & p);
};
✡✝ ✆
Nell’esempio il metodo set `e polimorfico in quanto sono presenti due
versioni:
La prima con due parametri float
La seconda con un solo parametro Complex
Corrado Santoro Il C++ in pillole
Polimorfismo, overloading operatori e cout
Cosa accade con una istruzione del genere?
✞
float res = 10.5;
cout << "Risultato = " << res << "n";
✡✝ ✆
1. L’operatore << `e left-associativo, quindi l’espressione equivale a:
✞
float res = 10.5;
( ( (cout << "Risultato = ") << res) << "n");
✡✝ ✆
2. Valutazione della prima parentesi, viene cercata la funzione
seguente:
✞
ostream & operator<<(ostream & out, char * s)
{
printf("%s", s);
return out;
}
✡✝ ✆
3. “Risultato = ” `e stampato a schermo e l’espressione diventa:
✞
float res = 10.5;
( ( cout << res) << "n");
✡✝ ✆
Corrado Santoro Il C++ in pillole
Polimorfismo, overloading operatori e cout
✞
float res = 10.5;
( ( cout << res) << "n");
✡✝ ✆
4. Valutazione della successiva parentesi, viene cercata la funzione
seguente:
✞
ostream & operator<<(ostream & out, float f)
{
printf("%f", f);
return out;
}
✡✝ ✆
5. “10.5” `e stampato a schermo e l’espressione diventa:
✞
( cout << "n");
✡✝ ✆
6. Valutazione dell’ultima, viene cercata nuovamente la funzione
seguente:
✞
ostream & operator<<(ostream & out, char * s);
✡✝ ✆
7. Il carattere di a-capo viene stampato sullo schermo.
Corrado Santoro Il C++ in pillole
Ereditariet`a
Corrado Santoro Il C++ in pillole
Ereditariet`a: Sintassi
class newClass : visibility baseClass { ... } ;
✞
class InheritedClass : private BaseClass {
// ....
};
class InheritedClass : protected BaseClass {
// ....
};
class InheritedClass : public BaseClass {
// ....
};
✡✝ ✆
private: i membri public di BaseClass diventano private in
InheritedClass.
protected: i membri public di BaseClass diventano protected in
InheritedClass, i protected diventano private.
public: nessuna modifica.
Corrado Santoro Il C++ in pillole
Esempio sull’ereditariet`a
Una classe Rectangle e una classe ereditata Square che
specializza la classe base:
✞
class Rectangle {
float width, height;
public:
Rectangle(float w, float h);
float area() { return width * height; } ;
} ;
class Square : public Rectangle {
public:
Square(float side);
};
Rectangle::Rectangle(float w, float h)
{
width = w;
height = h;
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Esempio sull’ereditariet`a: sintassi dei costruttori
Ogni classe ereditata, nel suo costruttore, deve chiamare il
costruttore padre come prima istruzione:
✞
class Rectangle {
float width, height;
public:
Rectangle(float w, float h);
float area() { return width * height; } ;
} ;
class Square : public Rectangle {
public:
Square(float side);
};
Rectangle::Rectangle(float w, float h)
{
width = w;
height = h;
}
Square::Square(float side) : Rectangle(side, side) // invocazione del costruttore del padre
{
// niente da fare qua!
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Esempio sull’ereditariet`a
✞
#include <iostream>
using namespace std;
class Rectangle {
float width, height;
public:
Rectangle(float w, float h);
float area() { return width * height; } ;
} ;
class Square : public Rectangle {
public:
Square(float side);
};
Rectangle::Rectangle(float w, float h)
{ width = w; height = h; }
Square::Square(float side) : Rectangle(side, side) // invocazione del costruttore del padre
{ }
int main(int argc, char **argv)
{
Rectangle r(10,20);
Square q(50);
cout << "Area rettangolo = " << r.area() << "n";
cout << "Area quadrato = " << q.area() << "n";
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Usiamo l’allocazione dinamica
✞
#include <iostream>
using namespace std;
class Rectangle {
float width, height;
public:
Rectangle(float w, float h);
float area() { return width * height; } ;
} ;
class Square : public Rectangle {
public:
Square(float side);
};
Rectangle::Rectangle(float w, float h)
{ width = w; height = h; }
Square::Square(float side) : Rectangle(side, side) // invocazione del costruttore del padre
{ }
int main(int argc, char **argv)
{
Rectangle * r = new Rectangle(10,20);
Square * q = new Square(50);
cout << "Area rettangolo = " << r->area() << "n";
cout << "Area quadrato = " << q->area() << "n";
}
✡✝ ✆
Corrado Santoro Il C++ in pillole
Polimorfismo dei puntatori
✞
...
class Square : public Rectangle { ... };
...
void print_area(Rectangle * obj)
{
cout << "Area = " << obj->area() << "n";
}
int main(int argc, char **argv)
{
Rectangle * r = new Rectangle(10,20);
Square * q = new Square(50);
print_area(r);
print_area(q);
}
✡✝ ✆
Ci`o `e possibile in quanto il tipo di q `e polimorfico:
“Square *” per definizione, e
“Rectangle *” poich´e Square `e sottoclasse di
Rectangle.
Corrado Santoro Il C++ in pillole
Virtual vs. non-virtual inheritance
✞
...
class Rectangle {
float width, height;
public:
Rectangle(float w, float h);
float area() { return width * height; } ;
void show_area() { cout << "Area rettangolo = " << area() << "n"; };
} ;
class Square : public Rectangle {
public:
Square(float side);
void show_area() { cout << "Area quadrato = " << area() << "n"; };
};
...
void print_area(Rectangle * obj)
{
obj->show_area();
}
int main(int argc, char **argv)
{
Rectangle * r = new Rectangle(10,20);
Square * q = new Square(50);
print_area(r);
print_area(q);
}
✡✝ ✆
Cosa ci aspettiamo che stampi questo programma?
Corrado Santoro Il C++ in pillole
Virtual vs. non-virtual inheritance
✞
...
class Rectangle {
float width, height;
public:
Rectangle(float w, float h);
float area() { return width * height; } ;
void show_area() { cout << "Area rettangolo = " << area() << "n"; };
} ;
class Square : public Rectangle {
public:
Square(float side);
void show_area() { cout << "Area quadrato = " << area() << "n"; };
};
...
void print_area(Rectangle * obj)
{
obj->show_area();
}
int main(int argc, char **argv)
{
Rectangle * r = new Rectangle(10,20);
Square * q = new Square(50);
print_area(r);
print_area(q);
}
✡✝ ✆
✞
Area rettangolo = 200
Area rettangolo = 2500
✡✝ ✆
Corrado Santoro Il C++ in pillole
Virtual vs. non-virtual inheritance
Non-virtual inheritance: Data una classe C, un metodo m e un
oggetto a di tipo C * ma proveniente da un tipo D *, dove D `e
sottoclasse di C, la scrittura a->m() esegue sempre il codice
del metodo definito in C. (Comportamento di default del C++,
non presente in Java)
Virtual inheritance: Data una classe C, un metodo m e un
oggetto a di tipo C * ma proveniente da un tipo D *, dove D `e
sottoclasse di C, la scrittura a->m() esegue sempre il codice
del metodo definito in D. (Comportamento da esplicitare in
C++ tramite la keyword virtual, modello di default in Java)
Corrado Santoro Il C++ in pillole
Virtual vs. non-virtual inheritance
✞
...
class Rectangle {
float width, height;
public:
Rectangle(float w, float h);
float area() { return width * height; } ;
virtual void show_area() { cout << "Area rettangolo = " << area() << "n"; };
} ;
class Square : public Rectangle {
public:
Square(float side);
void show_area() { cout << "Area quadrato = " << area() << "n"; };
};
...
void print_area(Rectangle * obj)
{
obj->show_area();
}
int main(int argc, char **argv)
{
Rectangle * r = new Rectangle(10,20);
Square * q = new Square(50);
print_area(r);
print_area(q);
}
✡✝ ✆
✞
Area rettangolo = 200
Area quadrato = 2500
✡✝ ✆
Corrado Santoro Il C++ in pillole
Il C++ in pillole
Corrado Santoro
ARSLAB - Autonomous and Robotic Systems Laboratory
Dipartimento di Matematica e Informatica - Universit`a di Catania, Italy
santoro@dmi.unict.it
L.A.P. 1 Course
Corrado Santoro Il C++ in pillole

Más contenido relacionado

La actualidad más candente

Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourserik0
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolarePyCon Italia
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsJUG Genova
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: FunzioniMajong DevJfu
 
Introduzione a R
Introduzione a RIntroduzione a R
Introduzione a RMCalderisi
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturatiMajong DevJfu
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Majong DevJfu
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Alberto Pasca
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedefPiero Fraternali
 

La actualidad más candente (20)

Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourse
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grails
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: Funzioni
 
DHow2 - L1
DHow2 - L1DHow2 - L1
DHow2 - L1
 
Introduzione a R
Introduzione a RIntroduzione a R
Introduzione a R
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
 
R Vectors
R VectorsR Vectors
R Vectors
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedef
 
05 1 intro-struttura
05 1 intro-struttura05 1 intro-struttura
05 1 intro-struttura
 
2008 python
2008 python2008 python
2008 python
 

Destacado

Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Codemotion
 
Integrating Cloud Services in Behaviour Programming for Autonomous Robots
Integrating Cloud Services in Behaviour  Programming for Autonomous RobotsIntegrating Cloud Services in Behaviour  Programming for Autonomous Robots
Integrating Cloud Services in Behaviour Programming for Autonomous RobotsCorrado Santoro
 
Presentation @ WOA 2015
Presentation @ WOA 2015 Presentation @ WOA 2015
Presentation @ WOA 2015 Corrado Santoro
 
Using Ready-for-PIC and SDR Libraries
Using Ready-for-PIC and SDR LibrariesUsing Ready-for-PIC and SDR Libraries
Using Ready-for-PIC and SDR LibrariesCorrado Santoro
 
Exercises with timers and UART
Exercises with timers and UARTExercises with timers and UART
Exercises with timers and UARTCorrado Santoro
 
Handling Asynchronous Events in MCUs
Handling Asynchronous Events in MCUsHandling Asynchronous Events in MCUs
Handling Asynchronous Events in MCUsCorrado Santoro
 
Reactive Autonomous System Programming using the PROFETA tool
Reactive Autonomous System Programming using the PROFETA toolReactive Autonomous System Programming using the PROFETA tool
Reactive Autonomous System Programming using the PROFETA toolCorrado Santoro
 
Using Timer2 in Microchip MCUs
Using Timer2 in Microchip MCUsUsing Timer2 in Microchip MCUs
Using Timer2 in Microchip MCUsCorrado Santoro
 
Capitolo 7 elementi di programmazione c-c++
Capitolo 7   elementi di programmazione  c-c++Capitolo 7   elementi di programmazione  c-c++
Capitolo 7 elementi di programmazione c-c++Giovanni Della Lunga
 
Programming the Digital I/O Interface of a PIC microcontroller
Programming the Digital I/O Interface of a PIC microcontrollerProgramming the Digital I/O Interface of a PIC microcontroller
Programming the Digital I/O Interface of a PIC microcontrollerCorrado Santoro
 
Using Timers in PIC18F Microcontrollers
Using Timers in PIC18F MicrocontrollersUsing Timers in PIC18F Microcontrollers
Using Timers in PIC18F MicrocontrollersCorrado Santoro
 
Pulse Width Modulation Signal Generation with MCUs
Pulse Width Modulation Signal Generation with MCUsPulse Width Modulation Signal Generation with MCUs
Pulse Width Modulation Signal Generation with MCUsCorrado Santoro
 
Introduction to microcontrollers
Introduction to microcontrollersIntroduction to microcontrollers
Introduction to microcontrollersCorrado Santoro
 
Introduction to shell scripting
Introduction to shell scriptingIntroduction to shell scripting
Introduction to shell scriptingCorrado Santoro
 
Presentation @ Miniscuola WOA 2015
Presentation @ Miniscuola WOA 2015Presentation @ Miniscuola WOA 2015
Presentation @ Miniscuola WOA 2015Corrado Santoro
 

Destacado (20)

Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
 
Integrating Cloud Services in Behaviour Programming for Autonomous Robots
Integrating Cloud Services in Behaviour  Programming for Autonomous RobotsIntegrating Cloud Services in Behaviour  Programming for Autonomous Robots
Integrating Cloud Services in Behaviour Programming for Autonomous Robots
 
Presentation @ WOA 2015
Presentation @ WOA 2015 Presentation @ WOA 2015
Presentation @ WOA 2015
 
Using Ready-for-PIC and SDR Libraries
Using Ready-for-PIC and SDR LibrariesUsing Ready-for-PIC and SDR Libraries
Using Ready-for-PIC and SDR Libraries
 
Exercises with timers and UART
Exercises with timers and UARTExercises with timers and UART
Exercises with timers and UART
 
Handling Asynchronous Events in MCUs
Handling Asynchronous Events in MCUsHandling Asynchronous Events in MCUs
Handling Asynchronous Events in MCUs
 
Reactive Autonomous System Programming using the PROFETA tool
Reactive Autonomous System Programming using the PROFETA toolReactive Autonomous System Programming using the PROFETA tool
Reactive Autonomous System Programming using the PROFETA tool
 
Using Timer2 in Microchip MCUs
Using Timer2 in Microchip MCUsUsing Timer2 in Microchip MCUs
Using Timer2 in Microchip MCUs
 
Capitolo 7 elementi di programmazione c-c++
Capitolo 7   elementi di programmazione  c-c++Capitolo 7   elementi di programmazione  c-c++
Capitolo 7 elementi di programmazione c-c++
 
UART MCU
UART MCUUART MCU
UART MCU
 
Informatica di base
Informatica di baseInformatica di base
Informatica di base
 
Soc
SocSoc
Soc
 
Programming the Digital I/O Interface of a PIC microcontroller
Programming the Digital I/O Interface of a PIC microcontrollerProgramming the Digital I/O Interface of a PIC microcontroller
Programming the Digital I/O Interface of a PIC microcontroller
 
Using Timers in PIC18F Microcontrollers
Using Timers in PIC18F MicrocontrollersUsing Timers in PIC18F Microcontrollers
Using Timers in PIC18F Microcontrollers
 
Pulse Width Modulation Signal Generation with MCUs
Pulse Width Modulation Signal Generation with MCUsPulse Width Modulation Signal Generation with MCUs
Pulse Width Modulation Signal Generation with MCUs
 
Introduction to microcontrollers
Introduction to microcontrollersIntroduction to microcontrollers
Introduction to microcontrollers
 
Introduction to Erlang
Introduction to ErlangIntroduction to Erlang
Introduction to Erlang
 
Introduction to shell scripting
Introduction to shell scriptingIntroduction to shell scripting
Introduction to shell scripting
 
Presentation @ Miniscuola WOA 2015
Presentation @ Miniscuola WOA 2015Presentation @ Miniscuola WOA 2015
Presentation @ Miniscuola WOA 2015
 
Using Timer1 and CCP
Using Timer1 and CCPUsing Timer1 and CCP
Using Timer1 and CCP
 

Similar a Pillole di C++

Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Marcello Missiroli
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of KotlinErik Minarini
 
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerQt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerPaolo Sereno
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Corso pratico di C# - 2013
Corso pratico di C# - 2013Corso pratico di C# - 2013
Corso pratico di C# - 2013Matteo Valoriani
 
Qt Concurrent
Qt ConcurrentQt Concurrent
Qt ConcurrentQT-day
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaRobert Casanova
 
Effective Code Transformations in C++
Effective Code Transformations in C++Effective Code Transformations in C++
Effective Code Transformations in C++Marco Arena
 
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...Francesco Cirillo
 

Similar a Pillole di C++ (20)

Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of Kotlin
 
Javascript
JavascriptJavascript
Javascript
 
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
 
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerQt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Js intro
Js introJs intro
Js intro
 
iContract
iContractiContract
iContract
 
Corso pratico di C# - 2013
Corso pratico di C# - 2013Corso pratico di C# - 2013
Corso pratico di C# - 2013
 
Qt Concurrent
Qt ConcurrentQt Concurrent
Qt Concurrent
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
Effective Code Transformations in C++
Effective Code Transformations in C++Effective Code Transformations in C++
Effective Code Transformations in C++
 
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
 
Pycon Jungle
Pycon JunglePycon Jungle
Pycon Jungle
 
08 mapreduce
08   mapreduce08   mapreduce
08 mapreduce
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
Ese01 java
Ese01 javaEse01 java
Ese01 java
 
Lezione02
Lezione02Lezione02
Lezione02
 
Lezione02
Lezione02Lezione02
Lezione02
 

Último

Descrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxDescrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxtecongo2007
 
Quadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceoQuadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceoyanmeng831
 
Aristotele, vita e opere e fisica...pptx
Aristotele, vita e opere e fisica...pptxAristotele, vita e opere e fisica...pptx
Aristotele, vita e opere e fisica...pptxtecongo2007
 
Tosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxTosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxlorenzodemidio01
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....giorgiadeascaniis59
 
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxLorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxlorenzodemidio01
 
Presentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione CivicaPresentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione CivicaSalvatore Cianciabella
 
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxlorenzodemidio01
 
Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................giorgiadeascaniis59
 
Scrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileScrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileNicola Rabbi
 
descrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxdescrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxtecongo2007
 
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxlorenzodemidio01
 
discorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxdiscorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxtecongo2007
 
LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................giorgiadeascaniis59
 
Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.camillaorlando17
 
Lorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxLorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxlorenzodemidio01
 
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxLorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxlorenzodemidio01
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxlorenzodemidio01
 
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxLorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxlorenzodemidio01
 

Último (19)

Descrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxDescrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptx
 
Quadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceoQuadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceo
 
Aristotele, vita e opere e fisica...pptx
Aristotele, vita e opere e fisica...pptxAristotele, vita e opere e fisica...pptx
Aristotele, vita e opere e fisica...pptx
 
Tosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxTosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptx
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....
 
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxLorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
 
Presentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione CivicaPresentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione Civica
 
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
 
Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................
 
Scrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileScrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibile
 
descrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxdescrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptx
 
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
 
discorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxdiscorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptx
 
LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................
 
Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.
 
Lorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxLorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptx
 
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxLorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
 
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxLorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
 

Pillole di C++

  • 1. Il C++ in pillole Corrado Santoro ARSLAB - Autonomous and Robotic Systems Laboratory Dipartimento di Matematica e Informatica - Universit`a di Catania, Italy santoro@dmi.unict.it L.A.P. 1 Course Corrado Santoro Il C++ in pillole
  • 2. C++: Definizioni e Sintassi Base Corrado Santoro Il C++ in pillole
  • 3. Il C++ `e ... l’estensione del C con il supporto della programmazione ad oggetti. Ha le seguenti caratteristiche base: Definizione di classi e oggetti. Allocazione statica e dinamica degli oggetti. Ereditariet`a singola e multipla. Ereditariet`a virtual e non-virtual. Overloading degli operatori. Template (simili ai generics di Java). Libreria run-time molto ricca (Standard Template Library - STL). Corrado Santoro Il C++ in pillole
  • 4. C++: dichiarazione di classe ✞ class MyClass { private: // elenco dei membri (attributi e metodi) privati protected: // elenco dei membri (attributi e metodi) protetti public: // elenco dei membri (attributi e metodi) pubblici } ; // <----- RICORDATEVI DEL ";" FINALE!! ✡✝ ✆ Esempio: ✞ class Point { private: int x, y; public: Point(int ax, int ay); // costruttore int get_x(); int get_y(); } ; ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 5. Modificatori di visibilit`a public: il metodo o attributo `e visibile ovunque. private: il metodo o attributo `e visibile solo all’interno della stessa classe (default). protected: il metodo o attributo `e visibile solo all’interno della stessa classe e delle classi ereditate. Corrado Santoro Il C++ in pillole
  • 6. C++: dichiarazione e implementazione A differenza di Java, in C++ esiste (come in C) una netta separazione tra dichiarazione di classe e implementazione dei metodi. La dichiarazione di classe riporta solo l’elenco degli attributi ed il prototipo dei metodi. L’ implementazione dei metodi `e fatta separatamente riportando la definizione del metodo e, di seguito, il suo codice. Il nome effettivo del metodo, specificato nell’implementazione, `e formato dalla stringa nomeclasse::nomemetodo. Corrado Santoro Il C++ in pillole
  • 7. C++: dichiarazione e implementazione di classe ✞ class Point { private: int x, y; public: Point(int ax, int ay); // costruttore int get_x(); int get_y(); } ; Point::Point(int ax, int ay) { x = ax; y = ay; } int Point::get_x() { return x; } int Point::get_y() { return y; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 8. C++: dichiarazione e implementazione di classe E’ tuttavia possibile implementare un metodo direttamente nella dichiarazione di classe (Java-style). In tal caso il metodo verr`a trattato come inline. ✞ class Point { private: int x, y; public: Point(int ax, int ay); // costruttore int get_x() { return x; }; int get_y() { return y; }; } ; Point::Point(int ax, int ay) { x = ax; y = ay; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 9. Creazione e uso degli oggetti ✞ class Point { private: int x, y; public: Point(int ax, int ay); // costruttore int get_x() { return x; }; int get_y() { return y; }; } ; Point::Point(int ax, int ay) { x = ax; y = ay; } int main(int argc, char **argv) { Point p(4,5); // creazione *statica* oggetto p di classe Point printf("Point p = %d, %dn", p.get_x(), p.get_y()); } ✡✝ ✆ L’accesso ai metodi/attributi di un oggetto si effettua con la notazione puntata. p `e definito all’interno della funzione main e pertanto avr`a visibilit`a e vita solo dentro main. Appena la funzione terminer`a, p sar`a distrutto (stessa semantica delle variabili C). Corrado Santoro Il C++ in pillole
  • 10. Un altro esempio ✞ #include <stdio.h> class Point { private: int x, y; public: Point(int ax, int ay); // costruttore int get_x() { return x; }; int get_y() { return y; }; Point add(Point p); } ; Point::Point(int ax, int ay) { x = ax; y = ay; } Point Point::add(Point p) { Point ret_val(x + p.get_x(), y + p.get_y()); return ret_val; } int main(int argc, char **argv) { Point p1(4,5), p2(10,10); Point p3 = p1.add(p2); printf("Risultato = %d, %dn", p3.get_x(), p3.get_y()); } ✡✝ ✆ Compilazione: g++ file.cc -o file ... Corrado Santoro Il C++ in pillole
  • 11. Passaggio parametri, puntatori e reference Corrado Santoro Il C++ in pillole
  • 12. Semantica del passaggio di oggetti a metodi/funzioni La semantica di passaggio dei parametri `e identica a quella del C, cio´e i parametri (qualunque essi siano) vengono passati sempre per copia. Passare un oggetto a un metodo significa pertanto effettuarne una copia. ✞ ... Point Point::add(Point p) { // p riceve *una copia* di p2 e *non lo stesso p2* Point ret_val(x + p.get_x(), y + p.get_y()); return ret_val; // nella fase di "return", p3 riceve una *copia* di ret_val, // mentre ret_val viene distrutto alla conclusione del metodo add() } int main(int argc, char **argv) { Point p1(4,5), p2(10,10); Point p3 = p1.add(p2); // <--- p2 viene *copiato* sulla variabile p del metodo add printf("Risultato = %d, %dn", p3.get_x(), p3.get_y()); } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 13. Reference agli oggetti Q: E’ possibile avere dei reference, cos`ı come in Java? A: S`ı!, usando i puntatori e l’allocazione dinamica✞ #include <stdio.h> class Point { int x, y; // private per default public: Point(int ax, int ay); // costruttore int get_x() { return x; }; int get_y() { return y; }; Point add(Point * p); } ; Point::Point(int ax, int ay) { x = ax; y = ay; } Point Point::add(Point * p) { // p punta a p2; p2 e (*p) sono *LO STESSO OGGETTO* Point ret_val(x + p->get_x(), y + p->get_y()); // dato che p risulta un *puntatore*, uso la notazione "->" return ret_val; } int main(int argc, char **argv) { Point p1(4,5), p2(10,10); Point p3 = p1.add(&p2); // <-- passo il *PUNTATORE* a p2 printf("Risultato = %d, %dn", p3.get_x(), p3.get_y()); } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 14. Puntatori e reference In C++ `e possibile “nascondere” un puntatore usando una sintassi che permette di specificare un tipo reference ad oggetto. Di fatto `e un puntatore solo che `e nascosto (stessa semantica Java). ✞ class Point { ... public: ... Point add(Point & p); } ; ... Point Point::add(Point & p) { // p e p2 sono *LO STESSO OGGETTO*, il puntatore risulta ‘‘nascosto’’ Point ret_val(x + p.get_x(), y + p.get_y()); return ret_val; } int main(int argc, char **argv) { Point p1(4,5), p2(10,10); Point p3 = p1.add(p2); printf("Risultato = %d, %dn", p3.get_x(), p3.get_y()); } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 16. Allocazione dinamica E’ possibile allocare dinamicamente un oggetto usando l’operatore new (equivalente al “malloc”) il quale restituisce un puntatore all’oggetto. Tuttavia ogni oggetto allocato dinamicamente dovr`a essere esplicitamente distrutto usando l’operatore delete (no garbage collection). Ogni oggetto allocato dinamicamente esiste sempre fino a che non `e distrutto esplicitamente da un delete. Esempio: Point * p = new Point(3,4); Corrado Santoro Il C++ in pillole
  • 17. Allocazione dinamica ✞ #include <stdio.h> class Point { int x, y; // private per default public: Point(int ax, int ay); // costruttore int get_x() { return x; }; int get_y() { return y; }; Point * add(Point * p); } ; Point::Point(int ax, int ay) { x = ax; y = ay; } Point * Point::add(Point * p) { // alloco il risultato dinamicamente e ne restituisco il puntatore Point * ret_val = new Point(x + p->get_x(), y + p->get_y()); return ret_val; } int main(int argc, char **argv) { Point p1(4,5), p2(10,10); Point * p3 = p1.add(&p2); printf("Risultato = %d, %dn", p3->get_x(), p3->get_y()); delete p3; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 18. Allocazione dinamica di array E’ possibile usare gli operatori “new” e “delete” anche per allocare dinamicamente/deallocare un array. Allocazione di un array di tipo T: T * a = new T[size]; Deallocazione di un array: delete [] a; Esempio: int * p = new int[300]; Corrado Santoro Il C++ in pillole
  • 19. Costruttori e Distruttori Corrado Santoro Il C++ in pillole
  • 20. Costruttore e Distruttore La gestione del ciclo di vita di un oggetto `e demandata al programmazione che ne controlla sia la creazione che la distruzione (implicita o esplicita). Accanto al metodo speciale “costruttore” esiste dunque anche un metodo speciale denominato distruttore che viene invocato quando l’oggetto `e cancellato dalla memoria. ✞ class Point { int x, y; // private per default public: Point(int ax, int ay); // costruttore ˜Point(); // distruttore int get_x() { return x; }; int get_y() { return y; }; Point * add(Point * p); } ; Point::˜Point() { // .. codice del distruttore } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 21. Distruttore L’uso del distruttore `e fondamentale per liberare eventuali zone di memoria allocate dinamicamente dall’oggetto, altrimento non verrebbero rilasciate (no garbage collection). ✞ class MyClass { int * array; public: MyClass(int n); // costruttore ˜MyClass(); // distruttore ... } ; MyClass::MyClass(int n) { array = new int[n]; } MyClass::˜MyClass() { delete [] array; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 23. Overloading Operatori Tutti gli operatori (artimetici, logici, relazionali, array subscript []) posso essere ridefiniti sulla base del tipo dei loro argomenti. Esempio: considerando una classe Complex che rappresenta un numero complesso, `e possibile ridefinire gli operatori aritmetici in modo da poter scrivere un codice del tipo: ✞ ... Complex a, b, c, d; d = a + b * c; ... ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 24. Overloading Operatori Data un’espressione del tipo: ✞ Complex result, lhs, rhs; result = lhs + rhs; ✡✝ ✆ Il comportamento dell’operatore “+” pu`o essere ridefinito in una funzione o metodo chiamato operator+ con uno dei seguenti prototipi: ✞ // FUNZIONI Complex operator+(Complex lhs, Complex rhs); Complex operator+(Complex &lhs, Complex rhs); Complex operator+(Complex lhs, Complex &rhs); Complex operator+(Complex &lhs, Complex &rhs); ✡✝ ✆ ✞ // METODI DELLA CLASSE COMPLEX Complex Complex::operator+(Complex rhs); Complex Complex::operator+(Complex &rhs); ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 25. Overloading Operatori: Esempio ✞ class Complex { float re, im; public: Complex(); Complex(float r, float i); void set(float r, float i) { re = r; im = i; }; float real() { return re; }; float imag() { return im; }; Complex operator+(Complex & p); }; Complex::Complex() { re = 0; im = 0; } Complex::Complex(float r, float i) { this->re = r; this->im = i; } Complex Complex::operator+(Complex & p) { Complex result(re + p.re, im + p.im); return result; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 26. Overloading Operatori: Esempio ✞ class Complex { float re, im; public: Complex(); Complex(float r, float i); void set(float r, float i) { re = r; im = i; }; float real() { return re; }; float imag() { return im; }; Complex operator+(Complex & p); }; ... Complex Complex::operator+(Complex & p) { Complex result(re + p.re, im + p.im); return result; } main() { Complex a(1,2), b(3,4); Complex c = a + b; printf("Risultato = %f,%fn", c.real(), c.imag()); } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 27. Overloading Operatori: Esempio 2 ✞ class Complex { float re, im; public: Complex(); Complex(float r, float i); void set(float r, float i) { re = r; im = i; }; float real() { return re; }; float imag() { return im; }; }; ... Complex operator+(Complex & lhs, Complex & rhs) { Complex result(lhs.real() + rhs.real(), lhs.imag() + rhs.imag()); return result; } main() { Complex a(1,2), b(3,4); Complex c = a + b; printf("Risultato = %f,%fn", c.real(), c.imag()); } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 28. Overloading Operatori e Stream L’overloading degli operatori permette d’uso di una sintassi “elegante” quando occorre accedere ai file. I file in C++ (cos`ı come in Java) sono virtualizzati tramite oggetti di tipo stream. Poich`a la console `e essa stessa un file, essa `e virtualizzata tramite due oggetti: cout, di tipo ostream (equivalente alla printf) cin, di tipo istream (equivalente alla scanf) Essi sono definiti nell’header iostream Utilizzano gli operatori “>>” e “<<” Corrado Santoro Il C++ in pillole
  • 29. Stream e Cout: Esempio ✞ #include <iostream> // senza il .h, gli header file C++ non lo hanno using namespace std; // cout e cin sono definiti nel "namespace" std // Lo "using" serve a impostare un prefisso di namespace, // altrimenti occorrerebbe esplicitarlo main() { cout << "Hello worldn"; } ✡✝ ✆ ✞ #include <iostream> // senza il .h, gli header file C++ non lo hanno using namespace std; // cout e cin sono definiti nel "namespace" std // Lo "using" serve a impostare un prefisso di namespace, // altrimenti occorrerebbe esplicitarlo main() { int a, b; cout << "Inserisci due valori:"; cin >> a; cin >> b; cout << "Somma = " << (a + b) << "n"; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 31. Polimorfismo In C++ ogni metodo o funzione pu`o avere diverse forme (implementazioni) che differiscono a seconda dei tipi e del numero di parametri forniti. ✞ class Complex { float re, im; public: Complex(); Complex(float r, float i); void set(float r, float i) { re = r; im = i; }; void set(Complex &c) { re = c.real(); im = c.imag(); }; float real() { return re; }; float imag() { return im; }; Complex operator+(Complex & p); }; ✡✝ ✆ Nell’esempio il metodo set `e polimorfico in quanto sono presenti due versioni: La prima con due parametri float La seconda con un solo parametro Complex Corrado Santoro Il C++ in pillole
  • 32. Polimorfismo, overloading operatori e cout Cosa accade con una istruzione del genere? ✞ float res = 10.5; cout << "Risultato = " << res << "n"; ✡✝ ✆ 1. L’operatore << `e left-associativo, quindi l’espressione equivale a: ✞ float res = 10.5; ( ( (cout << "Risultato = ") << res) << "n"); ✡✝ ✆ 2. Valutazione della prima parentesi, viene cercata la funzione seguente: ✞ ostream & operator<<(ostream & out, char * s) { printf("%s", s); return out; } ✡✝ ✆ 3. “Risultato = ” `e stampato a schermo e l’espressione diventa: ✞ float res = 10.5; ( ( cout << res) << "n"); ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 33. Polimorfismo, overloading operatori e cout ✞ float res = 10.5; ( ( cout << res) << "n"); ✡✝ ✆ 4. Valutazione della successiva parentesi, viene cercata la funzione seguente: ✞ ostream & operator<<(ostream & out, float f) { printf("%f", f); return out; } ✡✝ ✆ 5. “10.5” `e stampato a schermo e l’espressione diventa: ✞ ( cout << "n"); ✡✝ ✆ 6. Valutazione dell’ultima, viene cercata nuovamente la funzione seguente: ✞ ostream & operator<<(ostream & out, char * s); ✡✝ ✆ 7. Il carattere di a-capo viene stampato sullo schermo. Corrado Santoro Il C++ in pillole
  • 35. Ereditariet`a: Sintassi class newClass : visibility baseClass { ... } ; ✞ class InheritedClass : private BaseClass { // .... }; class InheritedClass : protected BaseClass { // .... }; class InheritedClass : public BaseClass { // .... }; ✡✝ ✆ private: i membri public di BaseClass diventano private in InheritedClass. protected: i membri public di BaseClass diventano protected in InheritedClass, i protected diventano private. public: nessuna modifica. Corrado Santoro Il C++ in pillole
  • 36. Esempio sull’ereditariet`a Una classe Rectangle e una classe ereditata Square che specializza la classe base: ✞ class Rectangle { float width, height; public: Rectangle(float w, float h); float area() { return width * height; } ; } ; class Square : public Rectangle { public: Square(float side); }; Rectangle::Rectangle(float w, float h) { width = w; height = h; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 37. Esempio sull’ereditariet`a: sintassi dei costruttori Ogni classe ereditata, nel suo costruttore, deve chiamare il costruttore padre come prima istruzione: ✞ class Rectangle { float width, height; public: Rectangle(float w, float h); float area() { return width * height; } ; } ; class Square : public Rectangle { public: Square(float side); }; Rectangle::Rectangle(float w, float h) { width = w; height = h; } Square::Square(float side) : Rectangle(side, side) // invocazione del costruttore del padre { // niente da fare qua! } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 38. Esempio sull’ereditariet`a ✞ #include <iostream> using namespace std; class Rectangle { float width, height; public: Rectangle(float w, float h); float area() { return width * height; } ; } ; class Square : public Rectangle { public: Square(float side); }; Rectangle::Rectangle(float w, float h) { width = w; height = h; } Square::Square(float side) : Rectangle(side, side) // invocazione del costruttore del padre { } int main(int argc, char **argv) { Rectangle r(10,20); Square q(50); cout << "Area rettangolo = " << r.area() << "n"; cout << "Area quadrato = " << q.area() << "n"; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 39. Usiamo l’allocazione dinamica ✞ #include <iostream> using namespace std; class Rectangle { float width, height; public: Rectangle(float w, float h); float area() { return width * height; } ; } ; class Square : public Rectangle { public: Square(float side); }; Rectangle::Rectangle(float w, float h) { width = w; height = h; } Square::Square(float side) : Rectangle(side, side) // invocazione del costruttore del padre { } int main(int argc, char **argv) { Rectangle * r = new Rectangle(10,20); Square * q = new Square(50); cout << "Area rettangolo = " << r->area() << "n"; cout << "Area quadrato = " << q->area() << "n"; } ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 40. Polimorfismo dei puntatori ✞ ... class Square : public Rectangle { ... }; ... void print_area(Rectangle * obj) { cout << "Area = " << obj->area() << "n"; } int main(int argc, char **argv) { Rectangle * r = new Rectangle(10,20); Square * q = new Square(50); print_area(r); print_area(q); } ✡✝ ✆ Ci`o `e possibile in quanto il tipo di q `e polimorfico: “Square *” per definizione, e “Rectangle *” poich´e Square `e sottoclasse di Rectangle. Corrado Santoro Il C++ in pillole
  • 41. Virtual vs. non-virtual inheritance ✞ ... class Rectangle { float width, height; public: Rectangle(float w, float h); float area() { return width * height; } ; void show_area() { cout << "Area rettangolo = " << area() << "n"; }; } ; class Square : public Rectangle { public: Square(float side); void show_area() { cout << "Area quadrato = " << area() << "n"; }; }; ... void print_area(Rectangle * obj) { obj->show_area(); } int main(int argc, char **argv) { Rectangle * r = new Rectangle(10,20); Square * q = new Square(50); print_area(r); print_area(q); } ✡✝ ✆ Cosa ci aspettiamo che stampi questo programma? Corrado Santoro Il C++ in pillole
  • 42. Virtual vs. non-virtual inheritance ✞ ... class Rectangle { float width, height; public: Rectangle(float w, float h); float area() { return width * height; } ; void show_area() { cout << "Area rettangolo = " << area() << "n"; }; } ; class Square : public Rectangle { public: Square(float side); void show_area() { cout << "Area quadrato = " << area() << "n"; }; }; ... void print_area(Rectangle * obj) { obj->show_area(); } int main(int argc, char **argv) { Rectangle * r = new Rectangle(10,20); Square * q = new Square(50); print_area(r); print_area(q); } ✡✝ ✆ ✞ Area rettangolo = 200 Area rettangolo = 2500 ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 43. Virtual vs. non-virtual inheritance Non-virtual inheritance: Data una classe C, un metodo m e un oggetto a di tipo C * ma proveniente da un tipo D *, dove D `e sottoclasse di C, la scrittura a->m() esegue sempre il codice del metodo definito in C. (Comportamento di default del C++, non presente in Java) Virtual inheritance: Data una classe C, un metodo m e un oggetto a di tipo C * ma proveniente da un tipo D *, dove D `e sottoclasse di C, la scrittura a->m() esegue sempre il codice del metodo definito in D. (Comportamento da esplicitare in C++ tramite la keyword virtual, modello di default in Java) Corrado Santoro Il C++ in pillole
  • 44. Virtual vs. non-virtual inheritance ✞ ... class Rectangle { float width, height; public: Rectangle(float w, float h); float area() { return width * height; } ; virtual void show_area() { cout << "Area rettangolo = " << area() << "n"; }; } ; class Square : public Rectangle { public: Square(float side); void show_area() { cout << "Area quadrato = " << area() << "n"; }; }; ... void print_area(Rectangle * obj) { obj->show_area(); } int main(int argc, char **argv) { Rectangle * r = new Rectangle(10,20); Square * q = new Square(50); print_area(r); print_area(q); } ✡✝ ✆ ✞ Area rettangolo = 200 Area quadrato = 2500 ✡✝ ✆ Corrado Santoro Il C++ in pillole
  • 45. Il C++ in pillole Corrado Santoro ARSLAB - Autonomous and Robotic Systems Laboratory Dipartimento di Matematica e Informatica - Universit`a di Catania, Italy santoro@dmi.unict.it L.A.P. 1 Course Corrado Santoro Il C++ in pillole