Overloading di operatori
|
|
- Mattia Parisi
- 6 anni fa
- Visualizzazioni
Transcript
1 Overloading di operatori In C++ è possibile effettuare l overloading degli operatori per utilizzarli sugli oggetti delle classi definite dagli utenti complex.h class Complex { double m_re, m_im; public : Complex(double re, double im) : m_re(re), m_im(im) { // ; #include complex.h void main { Complex c1(1, 2), c2(3,4); Complex c3 = c1 + c2; ridefinizione di + Obiettivo: scrivere le espressioni in cui compaiono gli oggetti con la stessa concisione delle espressioni in cui compaiono i tipi predefiniti Laboratorio di Informatica Antonio Monteleone 69
2 Overloading di operatori (2) Permette di utilizzare tipi definiti dall utente come se fossero tipi fondamentali E possibile effettuare l overloading di qualunque operatore ad eccezione di..* ::? sizeof La cardinalità, l associatività e la precedenza di un operatore non possono essere modificati Non è possibile creare nuovi operatori ma solo ridefinire quelli esistenti L overloading di un operatore è effettuato mediante la definizione di una funzione operatore Laboratorio di Informatica Antonio Monteleone 70
3 Overloading di operatori (3) Le funzioni operatore possono essere implementate come Funzioni membro tipo_di_ritorno nome_classe::operator op(argomenti) op è l operatore da ridefinire Funzioni non membro tipo_di_ritorno operator op(argomenti) Non sempre è possibile ridefinire un operatore come f. membro #include <iostream> #include complex.h void main { Complex c1(1, 2); cout << c1; // operando sx non di tipo Complex no f. membro ostream & operator << (ostream & os, const Complex &c); Laboratorio di Informatica Antonio Monteleone 71
4 Operatori unari sono implementati come metodi senza argomenti (l oggetto è l argomento implicito) class Date { public: Date(int d, int m, int y); Date & operator++(); //preincr. ; Overloading di operatori (4) funzioni friend a un solo argomento void main() { Date d(12,03,2002); ++d; // d.operator++(); class Date { public: Date(int d, int m, int y); friend Date & operator++(date &); ; Date & operator++(date &); void main() { Date d(12,03,2002); ++d; // operator++(d); Laboratorio di Informatica Antonio Monteleone 72
5 Overloading di operatori (5) Operatori binari possono essere implementati come metodi con un argomento (il primo argomento, implicito, è l oggetto il cui operatore agisce) class Complex { double m_re, m_im; public: Complex(double re, double im); const Complex operator+(const Complex & c) { return Complex(m_re + c.m_re, m_im + c.m_im); ; funzioni friend a due argomenti. class Complex { public: Complex(double re, double im); friend const Complex operator+( const Complex &c1, const Complex &c2); ; const Complex operator+(const Complex & c1, const Complex &c2); Laboratorio di Informatica Antonio Monteleone 73
6 friend La parola chiave friend può essere usata per permettere che una certa funzione o classe abbia libero accesso ai dati privati della classe class A { private: int m_x; friend int fun(const A &); friend void C::f(int); ; class B { private: int m_y; friend class C; ; class C { void f(int i); void g(); ; int fun(const A & a) { return a.m_x; // OK perché friend void C::f(int i) { A a; a.m_x = i*10; // OK perché friend void C::g() { A a; a.m_x = 12; //errore: g non è friend Laboratorio di Informatica Antonio Monteleone 74
7 friend (2) friend e` nemico dell incapsulamento e quindi dell OOP Un uso eccessivo di friend è quasi sempre sintomo di un cattivo disegno Esistono però situazioni in cui l uso di friend può essere accettabile Overloading di operatori binari Considerazioni di efficienza Relazione speciale fra due classi Laboratorio di Informatica Antonio Monteleone 75
8 Ogni oggetto puo accedere al proprio indirizzo tramite un puntatore di nome this Il valore di this non puo essere cambiato this per una classe A il tipo di this e A* const o const A* const E particolarmente utile quando si definisce un operatore di assegnazione (=) o, in generale, quando si vuole restituire una copia o un riferimento all oggetto stesso class Time { public: Time(int h, int m, int s); Time & sethour(int h); Time & setmin(int m); private: int hh, mm, ss; ; void main(){ Time t(12,03,58); t.sethour(11).setmin(8); Time & Time::setHour(int h) { hh = (h>0 && h <24)? h : 0; return *this; Laboratorio di Informatica Antonio Monteleone 76
9 L overload dell operatore di assegnazione L operatore di assegnazione e un operatore binario invocato dal compilatore quando compare un istruzione di assegnazione fra variabili non utilizzata per inizializzare un oggetto class MyClass {/*..*/; void main() { MyClass b; MyClass a = b; // costruttore di copia a = b; // a.operator=(b); In assenza di overload, il compilatore crea una versione di default di tale operatore che effettua una copia degli oggetti membro a membro Laboratorio di Informatica Antonio Monteleone 77
10 L overload dell operatore di assegnazione (2) Una classe che ha dei membri di tipo puntatore deve sempre ridefinire l operatore = In assenza di overload, dopo l assegnazione la memoria puntata prima dell assegnazione dalla variabile puntatore dell operando sinistro non e piu accessibile i due oggetti hanno un puntatore alla stessa area di memoria L overload dell operatore = permette di eseguire la copia dell area puntata e non del puntatore. La memoria precedentemente puntata dall operando sinistro deve comunque essere deallocata e nuova memoria deve essere allocata Laboratorio di Informatica Antonio Monteleone 78
11 L overload dell operatore di assegnazione (3) Senza overload di = class IVector { public: IVector(int len=100):m_len(len) void main() { { /* */ IVector v1(10), v2(20); ~IVector() {/* */ v2 = v1; /* */ for (int i=0; i<v1.size(); ++i) int & operator [] (int i) { v1[i] = i; // v2[i]==i! assert(i>0 && i<m_len); // crash! return m_data[i] IVector & operator(const IVector &); Soluzione: overload di = private: int m_len; int *m_data; ; IVector & IVector::operator=(const IVector &src) { if (this == &src) return *this; if (m_data) delete [] m_data; m_len = src.m_len m_data = new int[m_len]; for (int i=0; i<m_len; ++i) m_data[i] = src.m_data[i]; return *this; Laboratorio di Informatica Antonio Monteleone 79
12 Overload degli operatori di I/O su stream Gli operatori << e >> possono essere ridefiniti per consentire operazioni del tipo: IVector v(10); for (int i=0; i<v.size(); ++i) v[i] = i; cout << Il vettore v vale << v << endl; Si utilizza una funzione friend: class IVector { friend ostream& operator<<(ostream& os, const IVector &v); /* */ ; ostream& operator <<(ostream& os, const IVector & v){ for (int i=0; i<v.size(); ++i) os << v[i] <<, ; return os ; // consente di scrivere cout << v1 << v2 Laboratorio di Informatica Antonio Monteleone 80
13 Sul valore di ritorno degli operatori Nell overloading degli operatori ci sono dei casi in cui è necessario restituire un oggetto per valore e altri in cui è necessario restituirlo per riferimento. T operator+(const T &a, const T &b); T &T::operator=(const T &rhs); E anche opportuno restituire un oggetto costante ogni volta questo è possibile. const T operator+(const T &a, const T &b); Laboratorio di Informatica Antonio Monteleone 81
14 #include point.h #include <iostream> using namespace std; using namespace labinfo; int main() { Point a(1,2), b(2,3); cout << (a += b); assert(a == Point(3, 5)); Sul valore di ritorno degli operatori Point c, d; c = d = b; // c = (d = b) o c.operator=(d.operator=(b)); assert(c == Point(2, 3)); (c = a).x = 10; // il valore di ritorno di operator= deve essere Point & assert(c.x == 10); cout << (d += a + b); assert(d == Point(7, 11)); Laboratorio di Informatica Antonio Monteleone 82
15 // continua il main Sul valore di ritorno degli operatori (d += a + b) += a; assert(d == Point(15, 24)); // (a + b).rotate(0.5); // errore se a + b restituisce un const Point e // Point::rotate non è const assert(a!= b); // (-a).rotate(b, 11); // errore se -a restituisce un const Point e // Point::rotate non è const // end of main Laboratorio di Informatica Antonio Monteleone 83
16 // point.h #include <cmath> namespace labinfo { Sul valore di ritorno degli operatori class Point { public: Point(double _x=0, double _y=0) : x(_x), y(_y) {; inline Point& operator+=(const Point &a) { x+=a.x; y+=a.y; return *this; inline Point& operator-=(const Point &a) { x-=a.x; y-=a.y; return *this; inline void rotate(const Point &p, double alpha) { x = (x-p.x)*cos(alpha) - (y-p.y)*sin(alpha) + p.x; y = (x-p.x)*sin(alpha) + (y-p.y)*cos(alpha) + p.y; inline void scale(double a, double b) { x *= a; y *= b; inline void scale(double a) { scale(a,a); double x, y; ; Laboratorio di Informatica Antonio Monteleone 84
17 Sul valore di ritorno degli operatori // inline const Point operator+(const Point &a, Point &b) { return Point(a)+=b; inline const Point operator-(const Point &a, Point &b) { return Point(a)-=b; ; inline const Point operator-(const Point &a) { return Point(-a.x,-a.y); // inline double operator*(const Point &a, const Point &b) { return a.x*b.x+a.y*b.y; // inline ostream & operator<<(ostream &out, Point &p) { return out << "(" << p.x << ", " << p.y << ")"; Laboratorio di Informatica Antonio Monteleone 85
18 Sul valore di ritorno degli operatori // inline const Point operator*(int a, const Point &p) { return Point(a*p.x,a*p.y); // inline const Point operator*(const Point &p, int a) { return Point(a*p.x,a*p.y); // inline bool operator==(const Point &p1, const Point &p2) { return (p1.x == p2.x && p1.y == p2.y); // bool operator!=(const Point &p1, const Point &p2) { return!(p1 == p2); // namespace labinfo Laboratorio di Informatica Antonio Monteleone 86
19 Sul valore di ritorno degli operatori Conclusioni: Ogniqualvolta una funzione operatore produce un nuovo oggetto questi deve essere restituito per valore. Se l oggetto restituito deve essere utilizzato solo come l-value allora conviene renderlo anche costante. Se l oggetto restituito deve essere utilizzato come r-value ( lo si deve modificare) allora questi deve essere restituito come riferimento (all oggetto su cui la funzione operatore è invocata). Laboratorio di Informatica Antonio Monteleone 87
20 Considerazioni su op= e op Potendo scrivere a = a + b; ci si potrebbe aspettare di poter scrivere anche a += b; Per i tipo definiti dall'utente non esiste nessuna relazione implicita tra operator= e operator+= e per poterli utilizzare entrambi è necessario definirli entrambi. Laboratorio di Informatica Antonio Monteleone 88
21 class Integer { public: Integer(int i) : m_value(i) { Integer &operator+=(const Integer &i) { m_value += i.m_value; return *this; bool operator==(const Integer &rhs) { return m_value == rhs.m_value; // int m_value; ; Considerazioni su op= e op E possibile implementare operator+ in termini di operator+= const Integer operator+(const Integer &a, const Integer &b) { return Integer(a) += b; La presenza di un oggetto senza nome facilita la Return Value Optimization (RVO) Laboratorio di Informatica Antonio Monteleone 89
22 Considerazioni su op= e op E' possibile rendere generica l implementazione di operator@ in termini di operator@= // math_ops.h // altre funzioni operatore template<typename T> const T operator+(const T & a, const T & b) { return T(a)+=b; template<typename T> const T operator-(const T & a, const T & b) { return T(a)-=b; // altre funzioni operatore La semplice inclusione di math_ops.h rende disponibile operator@ per le classi che definiscono operator@= uguale a +,-,*, ) In generale la versione op= di un operatore è sempre più efficiente della op Laboratorio di Informatica Antonio Monteleone 90
23 Operatori di incremento e decremento Gli operatori di incremento e decremento sono disponibili sia nella forma prefissa che in quella post-fissa. class Time { public: Time(int h=0, int m=0, int s=0) :m_h(h%24), m_m(m%60), m_s(s%60) { int gethour() { return m_h; int getmin () { return m_m; int getsec () { return m_s; void sethour(int h) { m_h = h%24; void setmin (int m) { m_m = m%60; void setsec (int s) { m_s = s%60; Time & operator++(); // incremento prefisso const Time operator++(int); // incremento post-fisso bool operator==(const Time &t) const; void print(ostream &os) const; private: int m_h, m_m, m_s; ; Laboratorio di Informatica Antonio Monteleone 91
24 Operatori di incremento e decremento ostream & operator <<(ostream &os, const Time &t) { t.print(os); return os; // incremento pre-fisso Time & Time::operator++() { m_s = (++m_s) % 60; if (m_s == 0) { m_m = (++m_m) % 60; if (m_m == 0) m_h = (++m_h) % 24; return *this; // ---- incremento post-fisso const Time Time::operator++(int) { Time old = *this; ++(*this); return old; Laboratorio di Informatica Antonio Monteleone 92
25 Operatori di incremento e decremento bool Time::operator==(const Time &t) const { return m_h == t.m_h && m_m == t.m_m && m_s == t.m_s; Nell uso della class Time Time time(10, 12, 55); ++time; // viene chiamato time.operator++() time++; // viene chiamato time.operator++(0) Con un tipo predefinito è possibile effettuare un doppio incremento prefisso int i = 10; ++++i; // dopo il doppio incremento prefisso i vale 12 Time time(10, 12, 55); ++++time; // time.operator++().operator++() assert(time == Time(10, 12, 57); Affinché il doppio incremento modifichi l'oggetto a cui è applicato e' necessario che l'operatore di incremento prefisso restituisca un riferimento a tale oggetto. Laboratorio di Informatica Antonio Monteleone 93
26 Operatori di incremento e decremento Per il doppio incremento post-fisso int i = 10; i++++; // tale espressione è sintatticamente sbagliata Leggendo tale espressione ci si aspetta un doppio incremento del valore di i. In realtà il valore dell'espressione i++ è il valore di i prima del primo incremento. Il secondo incremento agirebbe su tale valore e alla fine i sarebbe incrementato solo una volta e non due come ci si potrebbe aspettare. Per evitare ogni confusione il compilatore considera errata tale espressione. Laboratorio di Informatica Antonio Monteleone 94
27 Operatori di incremento e decremento Nell'overloading di un operatore è opportuno essere consistenti col comportamento dello stesso operatore sui tipi predefiniti. Per evitare che espressioni del tipo Time time(10, 12, 55); time++++; // time.operator++(0).operator++(0) siano considerate lecite è sufficiente che l'operatore di incremento post-fisso restituisca un oggetto costante (su un oggetto costante si possono invocare solo funzioni membro costanti) Raccomandazione: Quando possibile è sempre meglio utilizzare la forma prefissa di un operatore di incremento/decremento poiché tale forma evita la costruzione e la successiva distruzione di un oggetto temporaneo Laboratorio di Informatica Antonio Monteleone 95
28 Operatori di conversione In C e C++ il compilatore può eseguire dei cast impliciti da un tipo a un altro. void f1(double d) { void f2() { int i=10; f1(i); // promozione da int a double Le conversioni implicite tra tipi possono coinvolgere operatori di conversione definiti dall utente. class MyClass1 { public: // operator dst_type ( ); ; void f(){ MyClass1 cc; dst_type aa = cc; // conversione da MyClass1 a dst_type Laboratorio di Informatica Antonio Monteleone 96
29 Operatori di conversione Le conversioni implicite tra tipi possono coinvolgere costruttori con un solo argomento che di fatto agiscono come operatori di conversione class MyClass2 { public: MyClass2(int a); // ; void f(){ MyClass2 cc; cc = 10; // conversione da int a MyClass2 Anche se tali operatori di conversione possono rivelarsi utile, è opportuno utilizzarli con molta cautela. Laboratorio di Informatica Antonio Monteleone 97
30 Operatori di conversione template <typename T> class ASmartPointer { public: ASmartPointer(T *pointer=0) : m_pointer(pointer) { ~ASmartPointer() { delete m_pointer; T *operator->() { return m_pointer; T &operator*() { return *m_pointer; operator bool () { return m_pointer!= 0; private: ASmartPointer(const ASmartPointer &); void operator=(const ASmartPointer &); T *m_pointer; ; void testasmartpointer() { ASmartPointer<Point> sp1(new Point(1,1)); ASmartPointer<Point> sp2(new Point(2,2)); if (sp1 == sp2) cout << "non e' come sembra" << endl; Laboratorio di Informatica Antonio Monteleone 98
31 Operatori di conversione class IntArray { public: IntArray(int n) : m_size(n), m_array(new int [n]) { IntArray(const IntArray &rhs) { //... ~IntArray() { delete [] m_array; IntArray &operator=(const IntArray &rhs) { //... return *this; int & operator[] (int i) { return m_array[i]; private: int m_size; int *m_array; ; void testintarray() { IntArray ia(6); for (int i=0; i<6; ++i) ia[i] = i; ia = 5; // un errore di battitura // a ia viene assegnato un IntArray di 5 // elementi Laboratorio di Informatica Antonio Monteleone 99
32 Operatori di conversione E possibile impedire una conversione implicita di tipo attraverso un costruttore mediante l uso della parola chiave explicit class IntArray { public: explicit IntArray(int n) : m_size(n), m_array(new int [n]) { IntArray(const IntArray &rhs) { //... ~IntArray() { delete [] m_array; IntArray &operator=(const IntArray &rhs) { //... //... private: int m_size; int *m_array; ; void testintarray() { IntArray ia(6); for (int i=0; i<6; ++i) ia[i] = i; ia = 5; // grazie a explicit non compila Laboratorio di Informatica Antonio Monteleone 100
Template (1) Molte volte l operato di una funzione o le proprietà di una classe non dipendono dal tipo dei dati coinvolti
Template (1) Molte volte l operato di una funzione o le proprietà di una classe non dipendono dal tipo dei dati coinvolti int sumvector(int *array, int n) { int sum(0); for (int i = 0; i < n; ++i) sum
DettagliCostruttori/distruttori. Sovraccarico degli operatori. Costruttori/distruttori. Necessità di un cotruttore
Costruttori/distruttori. Sovraccarico degli operatori. Costruttori/distruttori Quando un oggetto viene allocato viene eseguita una routine di inizializzazione: il costruttore. Quando viene deallocato si
DettagliCorso di Programmazione ad Oggetti
Corso di Programmazione ad Oggetti Funzioni e classi friend Overloading di operatori aa 2008/2009 Claudio De Stefano 1 Le funzioni friend Nella definzione di una classe è possibile elencare quali funzioni,
DettagliCorso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica
Corso di Fondamenti di Informatica Puntatori e Allocazione Dinamica I puntatori (Richiamo) Il C++ prevede puntatori a dati di qualsiasi natura, semplici o strutturati e puntatori a funzione. In particolare
DettagliOggetti funzione (1) Laboratorio di Informatica Antonio Monteleone 177
Oggetti funzione (1) In C++ è possibile ridefinire l operatore di chiamata a funzione operator() valore_di_ritorno operator() (lista_argomenti); Un oggetto funzione è l istanza di una classe per la quale
DettagliLa programmazione ad oggetti (OOP)
Oggetti e Classi (CAP 10) Alberto Garfagnini, Marco Mazzocco Università degli studi di Padova 30 Novembre 2011 La programmazione ad oggetti (OOP) È un approccio concettuale alla programmazione (indipendente
DettagliLaboratorio di Algoritmi e Strutture Dati
Realizzazione di Liste (II) Laboratorio di Algoritmi e Strutture Dati Domenico Redavid redavid@di.uniba.it Materiale di base gentilmente concesso dal dott. Nicola Di Mauro Ricercatore presso l'univ. di
DettagliCorso di Fondamenti di Informatica Il sistema dei tipi in C++
Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Anno Accademico Francesco Tortorella Struttura di un programma C++ // Programma semplice in C++ #include int main() { cout
DettagliInformatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1
Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1 Cosa è il C++ E un linguaggio di programmazione derivato dal C Può essere usato per modificare il SO Unix e i suoi derivati (Linux)
DettagliCorso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 24 Ottobre 2014
Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli 24 Ottobre 2014 1 Una funzione membro importante: il costruttore In logica OOP l accesso allo stato interno di un istanza deve avvenire solo attraverso
DettagliEreditarietà gerarchica
Ereditarietà Ereditarietà L ereditarietà è importante per la creazione di software riutilizzabile e per controllare la complessita del codice Le classi nuove sono progettate sulla base di classi pre-esistenti
DettagliIl paradigma OO e le Classi
Oggetti e Classi (CAP 10) Alberto Garfagnini Università degli studi di Padova 1 Dicembre 2009 Il paradigma OO e le Classi La programmazione ad Oggetti () è una filosofia di programmazione che si basa sui
DettagliCorso di Fondamenti di Informatica
Corso di Fondamenti di Informatica Il tipo puntatore; l allocazione dinamica della memoria Claudio De Stefano - Corso di Fondamenti di Informatica 1 puntatori una variabile di tipo puntatore al tipo x
DettagliCorso di Programmazione ad Oggetti
Corso di Programmazione ad Oggetti Costruttori di copia, funzioni di accesso e variabili static aa 2008/2009 Claudio De Stefano Claudio De Stefano - Corso di Programmazione ad Oggetti - aa 2008/2009 1
DettagliElementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I
Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave
DettagliOperatore di indirizzo
Operatore di indirizzo L operatore unario di indirizzo & restituisce l indirizzo della locazione di memoria dell operando Il valore restituito non va usato come l- value (in quanto l indirizzo di memoria
DettagliSommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C
Sommario Introduzione... xv Organizzazione del volume... xv Argomenti...xvi Domande...xvi Verifiche...xvi Domande e risposte...xvi Esercizi...xvi Non è richiesta alcuna precedente esperienza di programmazione...
DettagliFondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni
Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti & Marco Sechi (email: saetti,marco.sechi@ing.unibs.it) Università degli
DettagliUniversità degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella
Corso di Informatica Tipi strutturati: Stringhe Anno Accademico 2010/2011 Francesco Tortorella Stringhe di caratteri La stringa è il tipo strutturato con cui vengono rappresentati gruppi di caratteri quali
DettagliLa classe std::vector della Standard Template Library del C++
La classe std::vector della Standard Template Library del C++ Alberto Garfagnini Università degli studi di Padova 23 Ottobre 2013 Programmazione generica in C++ : i Template I templates sono probabilmente
DettagliIntroduzione al linguaggio C Puntatori
Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2016
DettagliCorso di Programmazione a oggetti
Corso di Programmazione a oggetti Overloading delle funzioni e parametri di default a.a. 2014/2015 Francesco Fontanella Overloading delle funzioni In C++, è possibile dare a funzioni diverse lo stesso
DettagliUn esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)
Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore) Macchina astratta: un linguaggio di programmazione trasforma un calcolatore in una macchina
DettagliUniversità degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria
di Cassino e del Lazio Meridionale Corso di Informatica Allocazione dinamica di memoria Anno Accademico 2015/2016 Francesco Tortorella Allocazione dinamica di memoria Finora abbiamo considerato variabili
DettagliProgrammazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Elementi di Base Parte 3 Istruzioni di Assegnazione G. Mecca M. Samela Università della Basilicata Elementi di Base >> Sommario Sommario Introduzione Istruzioni
DettagliPOINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.
POINTERS Una variabile pointer è una variabile che ha come valore un indirizzo di memoria. Es. Sia y una variabile intera di valore e sia yptr una variabile pointer avente come valore l indirizzo di y.
DettagliLaboratorio di programmazione
Laboratorio di programmazione Lezione VIII Tatiana Zolo tatiana.zolo@libero.it 1 PROGRAMMAZIONE A OGGETTI Quando si programma a oggetti si scompone il problema in sottogruppi di parti collegate che tengono
DettagliCapitolo 10 - Strutture
1 Capitolo 10 - Strutture Strutture In molte situazioni, una variabile non è sufficiente per descrivere un oggetto. Ad esempio, una posizione sul piano cartesiano è identificata da due coordinate, e la
DettagliI Template in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di: Giancarlo Cherchi
I Template in C++ Corso di Linguaggi di Programmazione ad Oggetti 1 a cura di: Giancarlo Cherchi Introduzione Cosa sono i Template? TEMPLATE? MODELLI Funzionalità non presenti nelle prime versioni del
DettagliC: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
DettagliLinguaggio C. Tipi predefiniti e operatori. Università degli Studi di Brescia. Docente: Massimiliano Giacomin
Linguaggio C Tipi predefiniti e operatori Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 RICHIAMI char 8 bit Valori interi
DettagliCorso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Ing. Gianluca Caminiti Sommario ( OOP ) Programmazione Object-Oriented Incapsulamento, Ereditarietà, Polimorfismo Richiami
DettagliProgrammazione Java Struttura di una classe, Costruttore, Riferimento this
Programmazione Java Struttura di una classe, Costruttore, Riferimento this romina.eramo@univaq.it http://www.di.univaq.it/romina.eramo/tlp Roadmap > Struttura di una classe > Costruttore > Riferimento
DettagliImplementazione dell albero binario in linguaggio C++
Implementazione dell albero binario in linguaggio C++ Costruire il programma per gestire le operazioni su un albero binario. Ogni nodo dell albero contiene un codice e una descrizione; il programma deve
DettagliClassi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array
Classi e array Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array Si vuole definire una classe Polinomio per la rappresentazione di polinomi a
DettagliProgrammazione ad oggetti
Programmazione ad oggetti Tipi di dati Tipo = insieme di valori + insieme di operazioni Es. int: valori:, -2, -1, 0, 1, 2, operazioni:: +,-,*,/,
DettagliCorso di Fondamenti di Informatica
Corso di Fondamenti di Informatica Introduzione alla programmazione in C++ 1 Un introduzione Che cosa è il C++? La programmazione procedurale La programmazione orientata agli oggetti La programmazione
DettagliA. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas
Classi e oggetti A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas Oggetti La programmazione orientata agli oggetti, OOP (Object-Oriented Programming),
DettagliVariabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER
Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it Programmazione prof. Domenico
DettagliFondamenti di Informatica
Passaggio di parametri in C++ Il passaggio dei parametri tra funzione chiamante e funzione chiamata in C++ avviene secondo due modalità: Fondamenti di Informatica 16. Funzioni in C++ (parte 2) per valore
DettagliEspressioni. Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica!
Espressioni Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica! Valutazione automatica di expr aritmetiche = obiettivo primario dei primi LP
DettagliDal C al C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi
Dal C al C++ Corso di Linguaggi di Programmazione ad Oggetti 1 a cura di Giancarlo Cherchi 1 Commenti Non aumentano la dimensione del programma eseguibile ma si rivelano utili per riassumere il comportamento
DettagliLaboratorio di Programmazione Anno Accademico
Università di Roma La Sapienza, Facoltà di Ingegneria Corso di Laboratorio di Programmazione Anno Accademico 2004-2005 Corso di Laurea in Ingegneria Informatica Prof. Giuseppe De Giacomo (A L) & Prof.
DettagliEsercizio 2: Algebra dei Puntatori e Puntatori a Puntatori
Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori Salvatore Mandrà 7 Ottobre 2008 1 Esercizio L esercizio prevede l implementazione di funzioni per il prodotto di una matrice per un vettore, attraverso
DettagliIndice. Ordine di valutazione. Espressioni in C++ Le espressioni in C++ (CAP 4) Alberto Garfagnini e Marco Mazzocco A.A. 2014/ * 20 / 2
Le espressioni in C++ (CAP 4) Indice Le espressioni in C++ : precedenze e associatività degli operatori Alberto Garfagnini e Marco Mazzocco Università degli studi di Padova A.A. 2014/2015 gli operatori
DettagliIl linguaggio C funzioni e puntatori
Salvatore Cuomo Il linguaggio C funzioni e puntatori Lezione n. 8 Parole chiave: Linguaggio C, procedure, funzioni. Corso di Laurea: Informatica Insegnamento: Programmazione II, modulo di Laboratorio Email
DettagliInside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays
Pointers: Puntatori (I) Le variabili finora incontrate sono caratterizzate da un nome (o identificativo), un tipo, ed occupano un area di memoria di dimensione dipendente dal tipo. Per accedere ad una
DettagliLaboratorio di Programmazione e Calcolo
UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA E. AMALDI Laboratorio di Programmazione e Calcolo 6 crediti a cura di Severino Bussino Anno Accademico 2016-17 0) Struttura del Corso 1) Trattamento
DettagliPassaggio parametri puntatore
Passaggio parametri puntatore Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it
DettagliOttenere una modifica del parametro attuale
Ottenere una modifica del parametro attuale Le variabili passate come parametri a una funzione, se alterate durante l esecuzione, non cambiano valore all uscita dalla funzione (parametri passati per valore)
DettagliDefinizione di classi. Walter Didimo
Definizione di classi Walter Didimo Definizione di classi Fino ad ora abbiamo imparato a: creare oggetti da classi già pronte usare gli oggetti creati, invocando metodi la creazione e l uso di oggetti
DettagliProgrammazione Java Avanzata Programmazione Object- Oriented in Java
Programmazione Java Avanzata Programmazione Object- Oriented in Java Ing. Gianluca Caminiti Testi di Riferimento (Java) Cay Horstmann Concetti di informatica e fondamenti di Java Apogeo, 2007 (Versione
DettagliPuntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a
Puntatori in C Puntatori Variabili tradizionali indirizzo int a = 5; A00E... Proprietà della variabile a: nome: a A010 A012 5 tipo: int A014 valore: 5 indirizzo: A010 Finora abbiamo usato solo le prime
DettagliProgrammazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Elementi di Base Parte 3 Istruzioni di Assegnazione versione 2.0 Questolavoroè concessoin uso secondoi termini di unalicenzacreative Commons (vedi ultima pagina)
DettagliSi possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).
Operatori di incremento e decremento: ++ e -- ++ e -- sono operatori unari con la stessa priorità del meno unario e associatività da destra a sinistra. Si possono applicare solo a variabili (di tipi interi,
DettagliUniversità degli Studi di Cassino Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili
Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili Anno Accademico Francesco Tortorella Il concetto di visibilità Un programma C++ può assumere una struttura complessa grazie
DettagliClassi e oggetti Seconda parte. Oggetti dinamici
Università della Calabria Corso di Laurea in Ingegneria Elettronica Programmazione Orientata agli Oggetti A.A. 2006/2007 Classi e oggetti Seconda parte Paolo Trunfio * * DEIS, Università della Calabria
DettagliEspressioni e Operatori
Espressioni e Operatori Lezione 4 Espressioni Un espressione è formata da una o più operazioni Le operazioni sono rappresentate da operandi ed operatori operatore = simbolo che identifica l operazione
DettagliProgrammazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali
Programmazione a Oggetti Lezione 7 Il linguaggio Java: aspetti generali Sommario Obiettivi di JAVA Portabilità: produrre codice eseguibile su più piattaforme (JVM) Affidabilità: Evitare il più possibile
Dettaglicostruttori e distruttori
costruttori e distruttori Costruttore E un metodo che ha lo stesso nome della classe a cui appartiene: serve per inizializzare un oggetto all atto della sua creazione Ce ne possono essere uno, più di uno,
DettagliIndice. Introduzione PARTE PRIMA LE BASI DEL C++: IL LINGUAGGIO C 1
Indice Introduzione XV PARTE PRIMA LE BASI DEL C++: IL LINGUAGGIO C 1 Capitolo 1 Una panoramica sul linguaggio C 3 1.1 Le origini e la storia del linguaggio C 3 1.2 Il C è un linguaggio di medio livello
DettagliLaboratorio di Informatica
Liste semplici (semplicemente linkate) Una lista semplice e costituita da nodi Laboratorio di Informatica 7. Strutture complesse di dati in C++ Ogni nodo e una struttura che contiene : Dati Un riferimento
Dettagli#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++
Qualsiasi programma in C++ segue lo schema: #include // libreria che gestisce flusso di input e output using namespace std; // uso di librerie standard del C++ int main() { // dichiarazioni
DettagliINPUT: 2 parametri. double atan2( double y, double x) OUTPUT: risultato del calcolo. Le funzioni. Implementazioni di funzioni dell utente
Le funzioni in C++ (CAP 6) Alberto Garfagnini e Marco Mazzocco Università degli studi di Padova A.A. 14/15 Le funzioni Sono i mattoni fondamentali per la costruzione dei programmi in C++ (e C) Il prototipo
DettagliIntroduzione al C++ (continua)
Introduzione al C++ (continua) I puntatori Un puntatore è una variabile che contiene un indirizzo di memoria pi_greco 3.141592 pi_greco_ptr indirizzo di 3.141592 & DEREFERENZIAZIONE RIFERIMENTO * se x
DettagliVediamo come allocare dinamicamente un vettore di double: int dim; double *vect; cout << Dimmi la dimensione del vettore : ; cin >> dim;
Vediamo come allocare dinamicamente un vettore di double: int dim; double *vect; cout > dim; vect = new double[dim]; if (vect!= NULL) { int i; for (i=0; i
DettagliCorso di Programmazione ad Oggetti
Corso di Programmazione ad Oggetti I Template a.a. 2008/2009 Claudio De Stefano 1 Programmazione generica E una tecnica di programmazione che permette di definire una classe di oggetti (o una funzione)
DettagliPrecedenza e associatività. Complementi sul C - 2. Esempi. Esempi
Complementi sul C - 2 Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Precedenza e associatività () [] ->. S D! ~ ++ + * & (cast ) sizeof S D * / % S D + - (somma e sottrazione) S D >
DettagliI numeri razionali. Specifica: la sintassi. Specifica: la semantica
Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi Che cos è un tipo di dato? Tutti i linguaggi di programmazione tipati forniscono tipi ed operatori predefiniti
DettagliCorso di Programmazione a oggetti
Corso di Programmazione a oggetti Introduzione alla programmazione a oggetti aa 2014/2015 Francesco Fontanella La Programmazione Modulare Un programma può essere visto come un insieme di moduli che interagiscono
DettagliGli array Array multidimensionali I puntatori L aritmetica dei puntatori Puntatori ed array I reference L attributo const a puntatori e reference
Sintassi III Parte Indice Gli array Array multidimensionali I puntatori L aritmetica dei puntatori Puntatori ed array I reference L attributo const a puntatori e reference Array Per un tipo T t[size] è
DettagliBreve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN
Breve Manuale di Riferimento sulla Sintassi Linguaggi e versione aggiornata al 05/02/2004 Sommario Elementi di Base... 2 Dati, Tipi e Dichiarazioni... 2 Tipi di Dato di Base... 2 Tipi di Dato Strutturati...
DettagliPuntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm
DettagliProgrammazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++ Tipi Strutturati Concetti Avanzati versione 2.5 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca
DettagliSTRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe
STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe String Una stringa Java rappresenta uno specifico valore e come
DettagliSommario. Le differenze fra C e C++ Funzioni. Varie. Memoria. commenti. parametri per funzioni funzioni inline overloading di funzione
Introduzione al C++ Sommario Le differenze fra C e C++ commenti Funzioni parametri per funzioni funzioni inline overloading di funzione Varie input/output nuovi header punto di dichiarazione delle variabili
DettagliLezione 4. Costruttori
Lezione 4 Costruttori e distruttori Costruttori Quando si crea un oggetto di una classe è possibile inizializzarne i membri tramite il costruttore di classe Il costruttore è una funzione membro che ha
DettagliMETODI ESERCIZI. 07-xx_Esercizi[01] Versione del: venerdì 3 maggio Andrea Zoccheddu CORSO INFORMATICA ITI ANGIOY SASSARI
Versione del: venerdì 3 maggio 2013 07.XX METODI ESERCIZI Andrea Zoccheddu CORSO INFORMATICA ITI ANGIOY SASSARI Sintesi Esercizi sui metodi in Visual C#. Esercizio 1. scelta della firma Lo studente risponda
DettagliC# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate
C# delegates Vittorio Maniezzo Università di Bologna Vittorio Maniezzo Università di Bologna 1 Delegate I delegati possono essere visti come definizioni di tipi per puntatori a funzione. Permettono di
DettagliParametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi
Funzioni Introduzione Operatori & e * Passaggio by reference Passaggio di vettori Esercizio strcpy 2 Passaggio dei parametri Il linguaggio C prevede il passaggio di parametri by value Il chiamato non può
DettagliLe classi. Costruttori
Costruttori Le classi Usare una funzione per inizializzare membri di una classe viene considerato poco elegante. Ci si potrebbe dimenticare di invocare la funzione di inizializzaione o, peggio, chiamarla
DettagliFondamenti di Programmazione Prof.ssa Elisa Tiezzi. Programmazione orientata a oggetti
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi Programmazione orientata a oggetti 1 Programmazione OO Concetti base: dati istruzioni Dati: variabili tipi Istruzioni: istruzioni base strutture di controllo
DettagliIntroduzione alla programmazione in linguaggio C
Introduzione alla programmazione in linguaggio C Il primo programma in C commento Header della libreria Funzione principale Ogni istruzione in C va terminata con un ; Corso di Informatica AA. 2007-2008
DettagliLinguaggio C: PUNTATORI
Linguaggio C: PUNTATORI I puntatori sono una delle più importanti caratteristiche del linguaggio C. Permettono di lavorare a basso livello, mantenendo flessibilità e praticità. Il C utilizza molto i puntatori
DettagliCorso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 3 Novembre 2014
Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli 3 Novembre 2014 1 Programmazione Generica Polimorfismo attraverso l ereditarietà: Attraverso le classi, esiste la possibilità di definire nuovi
DettagliCapitolo 7 I puntatori in C
1 Capitolo 7 I puntatori in C 7.2 Dichiarazione e inizializzazione di puntatori Variabili puntatore Contengono gli indirizzi di memoria come valore Le normali variabili contengono uno specifico valore
DettagliLinguaggio C: Espressioni
Linguaggio C: Espressioni Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ 2 Ringraziamenti prof. Mirko Viroli, Università
DettagliIntroduzione al C++ Corso di C++ INFN LNS 13 Dicembre Corrado Santoro
Introduzione al C++ Corso di C++ INFN LNS 13 Dicembre 2010 Corrado Santoro Concetto di Oggetto Proposto del 1966 nell'ambito dell'ai per rappresentare l' universo del discorso (ambiente di riferimento
DettagliLaboratorio di Algoritmi e Strutture Dati
Realizzazione di Liste Laboratorio di Algoritmi e Strutture Dati Domenico Redavid redavid@di.uniba.it Materiale di base gentilmente concesso dal dott. Nicola Di Mauro Ricercatore presso l'univ. di Bari
Dettagli#include <iostream.h> #include <cassert> #define DEBUG. contenuto. struct Pila { int size; int defaultgrowthsize; int marker; int * contenuto; } ;
#include #include #define DEBUG struct Pila { int defaultgrowthsize; ; size marker contenuto 16 5 12 2 Pila * crea(int initialsize) { //crea uno Pila cout
DettagliLa Gestione della Memoria. Carla Binucci e Walter Didimo
La Gestione della Memoria Carla Binucci e Walter Didimo Esecuzione di programmi Java L esecuzione di un programma Java richiede: la compilazione del codice Java in bytecode Java (un linguaggio macchina
DettagliLe operazioni di allocazione e deallocazione sono a carico del sistema.
Allocazione della memoria In C++ è possibile creare (allocare) variabili in maniera statica o dinamica. Nell allocazione statica una variabile esiste ed è utilizzabile dal momento della sua dichiarazione
DettagliRicerca binaria (o dicotomica) di un elemento in un vettore
Ricerca binaria (o dicotomica) di un elemento in un La ricerca binaria o dicotomica è utilizzata per ricercare i dati in un ORDNATO. L algoritmo di ricerca binaria, dopo ogni confronto, scarta metà degli
DettagliLezione 3 Tipi di Dato Derivati
Lezione 3 Un tipo di dato derivato è ottenuto a partire da tipi di dato predefiniti attraverso gli operatori *, &, [] definendo enumerazioni definendo struct I tipi di dato derivati non sono tipi di dati
DettagliFondamenti di C++ Input/Output di base
Università della Calabria Corso di Laurea in Ingegneria Elettronica Programmazione Orientata agli Oggetti A.A. 2006/2007 Fondamenti di C++ Paolo Trunfio * * DEIS, Università della Calabria http://si.deis.unical.it/~trunfio
DettagliI puntatori sono variabili, il cui contenuto è un indirizzo di memoria (di variabili, di funzioni, etc).
I PUNTATORI I puntatori I puntatori sono variabili, il cui contenuto è un indirizzo di memoria (di variabili, di funzioni, etc). Una variabile fa riferimento diretto al suo contenuto, mentre un puntatore
DettagliIl C nel C++: Funzioni
Il C nel C++: Funzioni Funzioni (1) il concetto -> spezzare il programma in parti (procedure) una funzione è un parte di programma dotata di un nome che può essere richiamata in altri punti del programma
DettagliPuntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori
Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per
DettagliInizializzazione, Assegnamento e Distruzione di Classi
Inizializzazione, Assegnamento e Distruzione di Classi Lezione 9 Operazioni Automatiche In ogni programma C++ oggetti classe vengono gestiti automaticamente dal compilatore Inizializzati al momento della
DettagliIl linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
Dettagli