Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
N. De Francesco
N. De Francesco
N. De Francesco
return (x>y) ? x : y;
} void main() { int b; double c; // ... b= max(3,b); // tipo=int max<int>(int,int)
N. De Francesco
a= max(3,b);
tipo=int max<int>(int x, int y) { return (x>y) ? x : y;}
N. De Francesco
d = max(3.6,c); // OK: double max<double>(double, double) b = max(3.6,c); // OK: double max<double>(double, double) e conversione // d = max(3,c); } errore: non si deduce il tipo: // 3 e' intero, c e' double
// 3
tipo=int
void primo<int>(int*)
primo(array2);
// 3.5 tipo=double
void primo<double>(double*)
N. De Francesco
primo(array1);
primo(array2);
N. De Francesco
primo(array2); // 3.5 }
9
tipo=double*
void primo<double*>(double*)
N. De Francesco
// int max<int,int>(int,int)
b = max(3,c); // }
N. De Francesco
10
N. De Francesco
11
N. De Francesco
13
// specializzazione
void stampa(uno o){ o.print(); } // void stampa<uno>(uno)
N. De Francesco
14
tipo=int
void stampa<int>(int)
tipo=uno
void stampa<uno>(uno)
N. De Francesco
15
n=3, m=2
funzione<3,2>(int)
funzione<2,2>(9);
}
//
n=2, m=2
funzione<2,2>(int)
Gli argomenti sono necessariamente espliciti Le istanziazioni di n e m devono essere ESPRESSIONI COSTANTI
N. De Francesco
16
funzione<1+2,2>(8);
funzione<2,2>(9);
N. De Francesco
17
// 0 n=8, T=double
// risoluzione esplicita di T
N. De Francesco
18
gt<50+6>(101);
gt<8, double>(7);
N. De Francesco
19
void main(){
cout << max<int>(101,102) << endl; cout << max<int>(101,102)<< endl; cout << max<double>(101,102) << endl; } Ogni istanza ha la sua variabile statica // 1 102 // 2 102 // 1 102
N. De Francesco
20
N. De Francesco
21
N. De Francesco
22
if (top==size-1) return 0;
p[++top] = s; return 1; }; int pop(tipo& s){ if (top==-1) return 0;
s =p[top--];
return 1; } };
23
N. De Francesco
24
N. De Francesco
25
// file principale
# includestack.h
...
N. De Francesco
29
s =p[top--];
return 1; } };
30
N. De Francesco
31
void main() { gen<uno, due> obj1; gen<uno, uno> obj2; obj1.print(); // uno due obj2.print(); // uno uno }
class gen<int,int> { int a; int b; public: gen(int n, int m){a=n; b=m;} void print(){ cout << a << b;} };
void main() { gen<int, int> obj1 (3,4); obj1.print(); // 3 4 }
N. De Francesco
33
template<int n> cmod <n>::cmod(){ m=n; istanze ++; }; } template<int n> void cmod <n>::stampa(){ cout << istanze << \t << m << endl; } N. De Francesco
34
Derivazione semplice
N. De Francesco
35
persona
studente
N. De Francesco
36
BASE
DERIVATA
Anna
22 3 7777
persona
N. De Francesco
37
// classe derivata borsista, classe base studente class borsista : public studente{ public: int borsa; int durata; };
persona
studente
borsista
N. De Francesco
38
Anna 22
DERIVATA
3 7777 500 3
N. De Francesco
39
// classe derivata impiegato, classe base persona class impiegato : public persona{ public: int livello; int stipendio; };
persona
impiegato
studente
borsista
N. De Francesco
40
void main(){ persona p; studente s; impiegato i; borsista b; p.eta=21; strcpy(s.nome, anna); // s.persona::nome
N. De Francesco
41
// corretto : conversione implicita // da studente a persona errato : supertipo assegnato a sottotipo errato : tipi diversi // corretto : conversione implicita // da borsista a persona // corretto : conversione implicita // da borsista a studente
N. De Francesco
42
Anna 22 3 7777
p=s;
nome eta
Anna 22
N. De Francesco
43
pp=&p;
pp=&s; pp=&b;
// corretto
// corretto (conversione implicita) // corretto (conversione implicita)
// ps =&p;
}
errato
N. De Francesco
44
Un oggetto (puntatore ad oggetto) di un tipo pu essere convertito in un supertipo (puntatore ad un supertipo), ma non vale il viceversa
N. De Francesco
45
class persona { public: char nome [20]; int eta; void chisei(){ cout << nome << '\t'<< eta << endl; } }; char nome[20] int eta void chisei()
N. De Francesco
46
N. De Francesco
47
eta
chisei() esami matricola quantiesami() borsa durata
N. De Francesco
48
eta
chisei() esami matricola quantiesami() borsa durata b
N. De Francesco
49
borsista
N. De Francesco
50
// 4
// conversione // 5
N. De Francesco
51
classe1
classe2
classe3
N. De Francesco
52
// obj.classe3::a
// 2 // 7 // 8
a a a
obj
7 8 2
// conversione // 7 // conversione // 8
53
classe1* p1=&obj;
// conversione
classe2* p2=&obj;
classe3* p3=&obj; cout << p1->a; cout << p2->a; cout << p3->a; // // //
// conversione
7 8 2
a a a
7 8 2
N. De Francesco
54
studente
N. De Francesco
55
eta
chisei()
// anna
22
esami
matricola chisei() s
N. De Francesco
56
persona
Anna 22
3 4444
studente
matricola chisei()
N. De Francesco
57
N. De Francesco
58
5.3 Costruttori
class uno { public: int a; uno(int x) {a=x; cout << "nuovo uno" << a << endl;} }; class due: public uno { public: int b; due(int x): uno(x+1) {b=x; cout << "nuovo due << x << endl;} }; void main (){ due obj2(8); } // nuovo uno 9 // nuovo due 8 uno
due
N. De Francesco
59
a b chiamata a uno::uno(9)
chiamata a due::due(8)
a
b
9
8
a b
N. De Francesco
60
5.3 Costruttori
il costruttore di una classe derivata deve chiamare il costruttore della classe base nella lista di inizializzazione. Se non lo chiama esplicitamente, viene automaticamente chiamato il costruttore di default (se esiste)
class uno { public: uno() {cout << "nuovo uno" << endl;} }; class due: public uno { public: due(int x) {cout << "nuovo due << x << endl;} }; void main (){ due obj2(8); } // nuovo uno // nuovo due 8 due
61
uno
N. De Francesco
5.3 Costruttori
class uno { public: uno(int x) {cout << "nuovo uno" << endl;} }; class due: public uno { public: // due(int x) {} ERRORE: manca il costruttore di default // nella classe uno
};
N. De Francesco
62
5.3 Costruttori
class uno { public: uno(){cout << "nuovo uno" << endl;} }; class due: public uno { public: due() {cout << "nuovo due"<< endl;} }; class tre: public due { public: tre() {cout << "nuovo tre"<< endl;} }; void main (){ due obj2; // // tre obj3; // // // } nuovo nuovo nuovo nuovo nuovo uno due uno due tre
63
uno
due
tre
N. De Francesco
5.3 Costruttori
class uno { void main (){ int a; due obj1; public: uno() { // uno a= 7 a=0; // due default cout << uno default<< endl;} uno(int x) { due obj2(6); a=x; cout << "uno a=" << a << endl;} // uno default }; // due b= 6 class due: public uno { int b; } public: due(): uno(7) { b=0; cout << "due default"<< endl;} due(int x) { b=x; cout << "due b= " << b << endl;}
};
N. De Francesco
64
5.3 Costruttori
class persona { char nome[20]; int eta; public: persona(char* c, int n){ strcpy(nome, c); eta=n; } }; class studente : public persona{ int esami; int matricola; public: studente(char* c, int n, int e, int m): persona(c,n) { esami=e; matricola=m; } };
N. De Francesco
65
5.3 Distruttori
class uno { public: uno(); ~uno(); }; uno::uno(){cout << "nuovo uno" << endl;} uno::~uno(){cout << "via uno" << endl;} void main (){ due obj2; // nuovo uno // nuovo due // via due // via uno }
N. De Francesco
66
Membri statici
class A { public: static int quantiA; A(){ cout << "A = " << ++quantiA << endl;} }; int A::quantiA=0; class B : public A{ public: static int quantiB; B(){ cout << "B = " << ++quantiB << endl;} }; A p2; // A = 3 void main(){ A p1; // A = 1 B s1; // A = 2
// B = 1
B s2;
// A = 4 // B = 2 }
int B::quantiB=0;
N. De Francesco
67
class persona { char nome[20]; int eta; public: persona(char* c, int n){ strcpy(nome, c); eta=n; } void chisei(){ cout << nome << '\t'<< eta << endl; } };
N. De Francesco
68
errore
};
N. De Francesco
69
};
cout << matricola << '\t'; cout << esami << endl;
N. De Francesco
70
class studente : public persona{ protected: int esami; int matricola; public: studente(char* c, int n, int e, int m): persona(c,n) {
void chisei(){ cout << nome << '\t'<< eta << endl; cout << matricola << '\t'; cout << esami << endl; } N. De Francesco // OK
};
71
I campi privati di una classe non sono accessibili dalle sottoclassi n dallesterno I campi protetti di una classe sono accessibili dalle sottoclassi, ma non dallesterno I campi pubblici di una classe sono accessibili anche dallesterno I campi privati, protetti e pubblici rimangono tali in tutta la gerachia
N. De Francesco
72
// obj2.b=0; errore b e
// protetta in due obj2.c=0; // OK: c e
// pubblica in due
}
N. De Francesco
73
N. De Francesco
74
A due livelli
1. costruttori degli oggetti membri della classe base 2. costruttore della classe base 3. costruttori degli oggetti membri della classe derivata 4. costruttore della classe derivata
N. De Francesco
75
76