Fdocumenti.com Corso c
Fdocumenti.com Corso c
Antonio Furone
Febbraio 2000
C++ Linguaggio OO
Svantaggi:
#include "stdafx.h"
#include < iostream.h >
a = 4 /* commento */ + 5;
... }
Gli identificatori sono simboli definiti dal
programmatore per riferirsi a cinque diverse categorie
Identificatori di oggetti:
•Variabili;
•Costanti simboliche;
•Etichette;
•Tipi definiti dal programmatore;
•Funzioni.
C++ Il Linguaggio
Parole riservate:
Sono inoltre considerate parole chiave tutte quelle che iniziano con un doppio underscore
__; esse sono riservate per le implementazioni del linguaggio e per le librerie standard, e il
loro uso da parte del programmatore dovrebbe essere evitato in quanto non sono portabili.
C++ Il Linguaggio
Tipi primitivi:
Un tipo e` una coppia <V, O>, dove V e` un insieme di valori e O e` un insieme
di operazione per la creazione e la manipolazione di elementi di V. I quattro tipi
fondamentali del C++:
Gli operatori sono raggruppati per tipologia e ordinati per precedenza di valutazione
C++ Il Linguaggio: Operatori
equivale a
Pluto = (Pippo = 5);
FOR
C++ Il Linguaggio:Controllo del flusso
switch ( <Espressione> )
SWITCH
{
case <Valore1>: <Blocco> ; /* ... */
case <ValoreN> : <Blocco> ;
default : <Blocco> ;
}
C++ Il Linguaggio:Controllo del flusso
<Etichetta> : <Istruzione>
GOTO
...
goto <Etichetta>
COSTANTI
void funz()
{
int x = 5; // x e` creata e distrutta ogni volta
static int c = 3; /* ... */
}
La variabile c è creata la prima volta
che si esegue la funzione e distrutta
alla fine del programma.
C++ Il Linguaggio: Array
I puntatori possono essere pensati come maniglie da applicare alle porte delle
celle di memoria per poter accedere al loro contenuto sia in lettura che in
scrittura, nella pratica una variabile di tipo puntatore contiene l'indirizzo di una
locazione di memoria.
Vediamo alcune esempi di dichiarazione di puntatori:
short * p1; void * PuntatoreGenerico;
Persona * p2;
I puntatori void possono essere
double * * p3; inizializzati come un qualsiasi altro
puntatore tipizzato, e a differenza di
questi ultimi possono puntare a
int UnIntero = 5; qualsiasi oggetto senza riguardo al tipo
o al fatto che siano costanti, variabili o
int * PuntatoreAInt =
funzioni; tuttavia non e` possibile
&UnIntero; eseguire sui puntatori void alcune
operazioni definite sui puntatori
Puntatore = 0;//non punta a
tipizzati.
nulla (NULL)
C++ Il Linguaggio: I puntatori
Persona Pippo;
Persona * Puntatore = &Pippo;
Puntatore -> Eta = 40;
-> = deferenzia e
automaticamente seleziona il
campo Eta.
int a[3]={1,2,3};
int *p=0;
p=&a[0];
if (p==a)
cout << "Vera" << endl;
C++ Il Linguaggio: Reference
//delete p;
delete &r;
Una funzione può restituire sia un
puntatore che un reference.
int &r=*new int[2];
C++ Il Linguaggio: Puntatori vs
Reference
int x=5; int &somma(int *x,int y)
int *px=&x; { int *z=new int;
int &z=somma(px,x); *z=*x+y;
return *z;
}
C++ Il Linguaggio: Linkage
{ return a; }
// File a.cpp
// File b.cpp
int a = 5;
extern int f(int);
int f(int c)
int GetVar()
{ return a+c; }
{ return f(5); }
C++ Il Linguaggio: Linkage
// Esempio.h
enum Color { Red, Green, Blue };
struct Point {
float X;
float Y; L'uso dei file header e` molto utile
}; quando si vuole partizionare un
programma in piu` moduli.
const int Max = 1000; Tuttavia la potenza dei file header
si esprime meglio quando si vuole
realizzare (o utilizzare) una
inline int Sum(int x, int y) { libreria di funzioni.
return x + y;
}
// Modulo1.cpp
#include "Esempio.h"
C++ OOP
#include <iostream.h>
Esempio:
class MyClass
{
private:
void MioMetodoPrivate(const int i)
{
cout << "MioMetodoPrivate" << endl;
h }
public:
void MioMetodoPublic(const int i);
protected:
};
this
#include "stdafx.h"
#include "MyClass.h"
public:
...
MyClass();
MyClass(const int i);
MyClass(MyClass& x) : M1(x.M1), M2(x.M2) {...} //copia
MyClass(int a, int b) : M1(a), M2(b) {...} // lista
// inizializzaz.ne
...
Membri Static : Membri propri della classe (non dell’istanza). Non è possibile
inizializzarli tramite lista .
Membri Const : Esso viene allocato per ogni istanza come un normale attributo,
tuttavia il valore che esso assume per ogni istanza viene stabilito una volta per
tutte all'atto della creazione dell'istanza stessa e non potra` mai cambiare durante
la vita dell'oggetto. E’ obbligatoria l’inizializzazione tramite lista .
char String[Size]; };
Membri Volatile:
Il C++ e` un linguaggio adatto a qualsiasi tipo di applicazione, in particolare a
quelle che per loro natura si devono interfacciare direttamente all'hardware.
Una prova in tal proposito e` fornita dalla keyword volatile che posta davanti
ad un identificatore di variabile comunica al compilatore che quella variabile
puo` cambiare valore in modo asincrono rispetto al sistema:
In alternativa:
•Con l'ereditarieta` pubblica i membri ereditati mantengono lo stesso grado di
protezione che avevano nella classe da cui si eredita (classe base immediata): i
membri public rimangono public e quelli protected continuano ad essere
protected;
•Con l'ereditarieta` protetta i membri public della classe base divengono
membri protected della classe derivata; quelli protected rimangono tali.
class < DerivedClassName > : [< Qualifier >] < BaseClassName >
{ /* ... */ };
Le Classi:
C++ Ereditarietà
{ /* ... */ };
T * Ptr = 0;
Ptr = new Td; // Td derivata da T ed entrambi hanno un metodo Paint()
Ptr -> Paint();// Richiama il metodo di T !!!
/* ... */ } pT->T::Paint();
C++ Classi Astratte
Una classe che possiede funzioni virtuali pure e detta classe astratta
(o interfaccia) e non e` possibile istanziarla; essa puo` essere
utilizzata unicamente per derivare nuove classi forzandole a fornire
determinati metodi (quelli corrispondenti alle funzioni virtuali pure).
C++ Operatori
float Im; };
class Complex {
Operatore come membro di una classe
public:
private:
};
L'operatore di sottoscrizione
class TArray {
public: ... Anche gli operatori new e
int operator[](unsigned int Index); delete sono ridefinibili
private: int * Array;
unsigned int ArraySize;
};
int TArray::operator[](unsigned int Index)
{ if (Index<ArraySize) return Array[Index];
else /* Errore */ }
Conversioni di tipo
C++
Si intende una operazione volta a trasformare un valore di
un certo tipo in un altro valore di altro tipo. Esistono
conversioni implicite (decise dal compilatore e dette anche
coercizioni) ed esplicite decise dal programmatore.
int i = 5;
float f = 0.0;
double d = 1.0;
d = f + i;
d = (double)f + (double)i;
C++ Conversioni di tipo
Ereditarietà
#include <path>
#include “path”
#if DLEVEL == 0
#define STACK 0
#elif DLEVEL == 1
#define STACK 100
#else
#define STACK 200
#endif
Allocazione e
if (argc!=3)
{
cout << "Errore nel passaggio dei Parametri" << endl;
return;
}
Allocazione e
// Lettura di un file
ifstream ifile("appo.txt");
C++ Gestione Files
ifile.close();
}