Estratto del documento

Programmazione orientata agli oggetti

Supera alcuni limiti della programmazione strutturata quando i problemi da risolvere sono complessi. Questo tipo di programmazione enfatizza i dati. L'idea fondamentale è quella di combinare in un unico modulo sia i dati che le funzioni che operano su di essi; tale modulo viene detto oggetto. Le funzioni di un oggetto prendono il nome di funzioni membro o metodi, i dati di un oggetto si dicono attributi o variabili d'istanza. Un programma in C++ è solitamente costituito da un insieme di oggetti che comunicano tra loro tramite chiamata ad altre funzioni membro.

Il linguaggio C++ è un linguaggio multi paradigma per la programmazione strutturata, orientata agli oggetti e generica, questo data la retrocompatibilità con il linguaggio C. Il linguaggio C++ è astratto. Per astrazione si intende il fatto che si determinano le proprietà esterne di un'entità senza specificare i dettagli della sua composizione interna. In ogni livello di astrazione si visualizza il sistema in termini di componenti, di cui si ignora la composizione interna.

Concetti fondamentali

L'incapsulamento dei dati consiste nell'aggregare dati e operazioni ad essi relative nella stessa unità di programmazione. Oggetti che possiedono le stesse caratteristiche e comportamenti si raggruppano in classi. L'occultamento dei dati permette di separare l'aspetto di un componente, cioè la sua interfaccia con il mondo esterno dai suoi dettagli implementativi interni.

Oggetti e classi

In C++ un oggetto è un individuo specifico, mentre la classe è un individuo generico. È la classe che definisce i dati utilizzati per rappresentare l'oggetto e le operazioni che si possono eseguire su di essi. Data una classe, si possono creare variabili di quel tipo, dette istanze. Le istanze sono la concretizzazione degli oggetti descritti in una classe.

Un oggetto è un'entità che gioca un ruolo definito nella risoluzione del problema. Nell'OOP un problema non si scompone in funzione, come da tradizione, ma in oggetti. Nell'OOP gli oggetti sono istanze di classi, definire una classe è come definire un tipo di dato.

Il software

È una lista di istruzioni che il computer deve eseguire (programma). Il software di sistema è un insieme di programmi che gestisce le risorse stesse del computer. Il software applicativo è l'insieme dei programmi scritti per eseguire un compito specifico.

Il software di sistema, o sistema operativo, coordina differenti funzioni del sistema di elaborazione e gestisce l'hardware del computer per conto del software applicativo. Esso assegna, pianifica e controlla l'uso di risorse e compiti del computer.

Compilazione

Un compilatore traduce tutto il programma sorgente in un programma eseguibile. L'operazione si chiama compilazione. Il processo che porta dal sorgente all'eseguibile integra anche una fase di linking, ovvero la fase di collegamento dei vari sottoprogrammi e librerie.

Software e copyright

  • Il software è tutelato dalle leggi sul diritto d'autore, il proprietario è colui che detiene i diritti di copyright. Normalmente un programma non si acquista ma si ottiene la licenza d'uso che stabilisce le facoltà dell'acquirente.
  • Open source: chiunque può utilizzarlo, modificarlo ed anche redistribuito a pagamento.
  • Protetto da copyleft: l'autore vuole difendere la libertà della sua opera; il software può essere redistribuito ma non possono essere applicate restrizioni (ad es. la GPL).
  • Di pubblico dominio: non ha copyright né licenza d'uso. Si può anche vendere.
  • Proprietario: non open source.
  • Freeware: solo codice eseguibile, ma gratuito.
  • Shareware: solo codice eseguibile con pagamento dopo periodo di prova.
  • Commerciale: venduto per profitto.

Sviluppo di un programma in C++

  • Scrittura del codice sorgente su carta.
  • Editing del codice sorgente su computer.
  • Compilazione del codice sorgente.
  • Eseguire e colaudare (debug).

Struttura di un programma in C++

Un programma in C++ è costituito da una o più funzioni, delle quali una si deve chiamare obbligatoriamente main. Una funzione è una sequenza di istruzioni, un sottoprogramma, che compie una o più azioni. Un programma deve anche contenere una serie di direttive #include che consentono di includervi header file con funzioni e dati predefiniti.

Struttura tipica:

#include <iostream> //include la libreria di funzioni iostream per gestire l'I/O
using namespace std;  //serve per riconoscere il nome standard
int main(){
    ... codice ...
}

Direttive

Le direttive più usuali sono #include, #define e using. La direttiva #include nome_file indica al processore di inserire il contenuto del file nome_file nel sorgente. Il preprocessore andrà a sostituire alla direttiva il contenuto del file. L'header file fondamentale è iostream, che contiene le funzioni di I/O. I file come iostream sono header file (file di intestazione) perché si includono all'inizio del programma. Ad esso bisogna associare il using namespace std per permettere che le definizioni di iostream siano accessibili al programma.

La funzione main()

Ha la seguente struttura: nome, header, corpo, definizione e terminazione della funzione. Il corpo è la sequenza delle istruzioni che costituiscono il programma. Ogni istruzione deve essere terminata da un punto e virgola. In generale, una funzione C++ viene chiamata da un'altra funzione e l'intestazione costituisce l'interfaccia tra le due. Le parentesi dopo il nome contengono la lista degli argomenti detti anche parametri formali, descrivono il tipo e la quantità dei valori che la funzione dovrà ricevere dalla funzione chiamante.

La main() è una funzione speciale perché è invocata dal sistema operativo. Normalmente non ha parametri e restituisce un tipo intero: int main(). Il programma termina quando si esegue return 0 o return(0), non necessario nei moderni compilatori.

Dichiarazioni globali

Sono le dichiarazioni scritte prima della funzione main(). Gli elementi dichiarati sono quindi comuni a tutte le funzioni del programma. Possono anche essere dichiarate funzioni (prototipi).

Funzioni definite dall'utente

Tutte le funzioni hanno un nome, che si deve assegnare al momento della dichiarazione. Le funzioni si mandano poi in esecuzione invocando il loro nome e passandole valori che eventualmente richiedono nell'intestazione. La definizione di una funzione specifica anche le istruzioni che questa dovrà eseguire. Il tipo restituito può essere void (nessun output).

Commenti

Sono informazioni aggiuntive che si aggiungono al codice sorgente per spiegare al lettore cosa fa il codice. Si commenta aggiungendo // a inizio frase.

Elementi di un programma in C++

Token (elementi lessici dei programmi)

Esistono cinque classi di token: identificatori, parole riservate, letterali, operatori e separatori. Identificatori: sequenze di caratteri che possono contenere solo lettere, cifre e il carattere underscore (_). Il C++ è case sensitive. Parole riservate: il C++ riserva a se stesso degli indicatori che usa con significati e compiti specifici. Tali identificatori non possono essere ridefiniti dal programmatore.

Tipi di dato

  • Interi: tipo int e varianti (short, long e unsigned).
  • Reali: numeri decimali di tipo float, double o long double.
  • Caratteri: lettere, cifre, simboli e segni di interpunzione.

Il tipo più usato risulta l'int, che occupa comunemente 4 byte nelle architetture a 32 byte; il suo range va da -216 a 216. Anche il numero naturale, l'unsigned int, va su 4 byte, con un range da 0 a 232-1.

Definizione di variabili

Solitamente un variabile si definisce con tale formato:

<tipo di dato> <nome di variabile> = <valore iniziale>

Si possono anche dichiarare più variabili dello stesso tipo nella stessa riga. Per definire un numero in base ottale si pone lo 0 davanti al numero, per definire un numero in base esadecimale si pone 0x davanti al valore.

Tipo int

Rappresenta un numero intero. Può essere anche unsigned int (senza segno).

Tipi a virgola mobile

Rappresentano numeri reali a virgola mobile (floating point). La dichiarazione è analoga a quella dei numeri reali. Il tipo float richiede 4 byte, double 8 e long double 10.

Caratteri (char)

Fanno riferimento all'insieme dei caratteri ASCII. Il char spazia da -27 a 27. Si può trovare anche l'unsigned char da 0 a 255. Si possono realizzare anche operazioni numeriche con i char. Ad esempio se sottraggo 32 ad una lettera minuscola, ottengo la sua maiuscola. Dato che il char è un sottoinsieme di int si può assegnare un intero al tipo char. Occupa un byte. Ordinamento lessicografico: le cifre vengono prima delle lettere e le lettere maiuscole vengono prima delle lettere minuscole.

Tipo void

Indica un valore nullo, si può usare per dichiarare una funzione che non restituirà alcun valore o definire puntatori generici.

Tipo di dato bool

Può assumere due valori, true e false. Si può utilizzare per indicare se è successo un determinato evento o per restituire il risultato di un confronto. A livello macchina il C++ usa lo 0 per il valore false, tutti gli altri per il valore true.

Tipo enum

Il tipo di enumerazione è dichiarato dal programmatore.

enum rgb {red, green, blue}

È un insieme di costanti (enumeratori) definite dal programmatore. Agli enumeratori sono associati valori interi consecutivi a partire da 0, anche modificabili.

Costanti

Si possono definire con la parola riservata const, a cui poi si assegna un valore. Non possono essere modificate durante il programma o la compilazione restituirà errore.

  • Costanti letterali: prendono valori che si scrivono direttamente nel testo del programma (intere, reali, carattere).

Dichiarazioni di costanti con #define

Si possono creare costanti con la parola riservata const e la direttiva #define. Gli identificatori di costanti si scrivono tutto in maiuscolo, quelli di variabili tutto in minuscolo. Le costanti dichiarate con define si scrivono solitamente prima del main e dopo gli #include.

  • Costanti stringa: sono sequenze di caratteri racchiusi tra virgolette. Le stringhe si possono concatenare e possono essere scritte su più righe terminando ogni riga con "\". In memoria le stringhe si rappresentano con una sequenza di ASCII terminata dal carattere 0, solitamente inserito dal compilatore. Le costanti carattere si definiscono tra due apici ' ', le stringhe si racchiudono tra virgolette " ". La differenza è che la costante stringa include lo 0 a fine riga.
  • Costanti enumerative: permettono di creare liste di elementi affini. Il compilatore enumera gli identificatori, cioè assegna un valore a ogni elemento enumerato cominciando dallo 0. Si può anche alterare l'enumerazione fatta dal compilatore assegnando valori alla sequenza.

Costanti dichiarate const e volatile

Il formato generale per creare una costante è:

const tipo nome = valore;

Se si omette il tipo, C++ utilizza int.

Variabili

È un segmento di memoria continuo caratterizzato da un indirizzo e da un tipo. L'indirizzo è associato dal compilatore al nome della variabile, mentre la variabile stessa viene utilizzata per ospitare valori di quel tipo che possono essere modificati. Una variabile prima di essere utilizzata deve essere definita: prima il tipo poi il nome (char nome, o int nome). Una variabile può essere definita all'inizio del file o del blocco di codice che la utilizza oppure proprio nel punto di utilizzo. Fornendo un valore alla variabile la si inizializza. Una variabile definita dentro un blocco o una funzione potrà essere utilizzata solo al loro interno (locale), se definita al di fuori sarà una variabile globale. La memoria occupata da una variabile globale sarà tenuta fino alla fine del programma. Alle variabili definite e visibili si può dare un valore tramite l'istruzione di assegnamento: variabile (left value) = espressione (right value); prima si analizza l'espressione a destra, dopodiché si inserisce il risultato nella locazione di memoria rappresentata dal nome della variabile posta a sinistra.

Operatori ed espressioni

Un'espressione è costituita da uno o più operandi che si combinano tra loro tramite operatori per impostare un'operazione e restituire un risultato. Gli operatori in C++ si dividono in unari (necessitano di un solo operando, ad es. ++), binari (necessitano di due operandi, ad es. +), ternari (necessitano di tre operandi, ad es. ?:).

Nelle espressioni a più operatori valgono le regole di precedenza (priorità relativa di un operatore rispetto ad altri) e associatività (indica l'ordine un cui si valuta un'espressione composta). Le parentesi tonde hanno precedenza su tutto.

Operatore di assegnamento

L'operatore di assegnamento (=) assegna il valore dell'espressione alla sua destra a alla variabile posta alla sua sinistra. Permette anche di eseguire assegnamenti multipli. L'operatore assegnamento si può comporre anche con altri operatori:

  • += a+=b equivale a scrivere a=a+b
  • -= a-=b equivale a scrivere a=a-b
  • *= a*=b equivale a scrivere a=a*b
  • /= a/=b equivale a scrivere a=a/b
  • %= a%=b equivale a scrivere a=a%b (resto della divisione, solo se variabili intere)

Operatori aritmetici

+ - * / %

Operatori di incremento e decremento: ++ incremento e -- decremento, che rispettivamente sommano e sottraggono 1 alla variabile che hanno come argomento. È corretto scrivere ++(++x), ma dato che l'operatore di postincremento restituisce il valore della variabile, esso non può essere scritto come (x++)++, dato che non si può applicare un operatore ad un valore ma solo ad una variabile. Se gli operatori ++ e -- si usano come prefissi, l'operazione di incremento o decremento si effettua prima dell'operazione di assegnamento, se si usano come suffissi l'assegnamento si effettua prima dell'incremento o decremento.

  • Preincremento ++x equivale a x+=1 o x=x+1 restituisce la variabile x.
  • Postincremento x++ equivale a x+=1 o x=x+1 restituisce il valore della variabile x.

Stessa cosa per il decremento --.

Operatori relazionali

Gli operatori relazionali si usano in espressioni della forma espressione1 operatore_relazionale espressione2 dove espressione1 e 2 sono espressioni compatibili C++. L'operatore relazionale produce 0 o 1 a seconda del risultato del confronto.

  • == (uguale)
  • != (diverso)
  • > (maggiore) (o >=)
  • < (minore) (o <=)

Per valutare una successione di disuguaglianze come s<z<e si deve utilizzare la seguente espressione (s<z) && (z<e).

Operatori logici

Detti anche booleani sono: ! (not), && (and), || (or). Vale la tabella di verità:

b a&&b a||b !a
V V V  F
V F F  F
F V F  V
F F F  V

Gli operatori matematici hanno precedenza sugli operatori relazionali e gli operatori relazionali hanno precedenza sugli operatori logici. Gli operandi a sinistra degli operatori logici vengono sempre valutati per primi, se il loro valore è già sufficiente a determinare il risultato l'operando destro non viene valutato per risparmiare tempo della CPU. Questa proprietà si dice valutazione in cortocircuito.

Operatori di manipolazione dei bit

O bitwise, eseguono operazioni logiche sui bit degli operandi. Si applicano soltanto a char e int.

  • & bit a bit
  • | or inclusivo bit a bit
  • ^ or esclusivo bit a bit (XOR) (aut-aut)
  • ~ complemento a 1 (inversione di tutti i bit)
  • << spostamento di tutti i bit verso sinistra
  • >> spostamento di tutti i bit verso destra
0&0==0; 0&1==0; 1&0==0; 1&1==1;
0|0==0; 0|1==1; 1|0==1; 1|1==1;
0^0==0; 0^1==1; 1^0==1; 1^1==0;

Gli operatori di traslazione si scrivono nella forma valore << numero_di_bit o viceversa, dove il valore può essere di tipo int o char, il numero di bit determina di quanti bit si sposterà il valore. Gli operatori bitwise si possono anche comporre con =.

Operatore condizionale

È un operatore ternario che restituisce un valore che dipende dal valore dell'espressione booleana al primo membro. Il formato è:

espressione_booleana ? se_vera : se_falsa

Si valuta un'espressione booleana, se è true viene restituito il valore in se_vera, se false il valore in se_falsa.

Operatore virgola

Permette di combinare due o più espressioni che saranno valutate da sinistra verso destra.

Operatore sizeof()

Serve per conoscere le dimensioni in byte di un tipo di dato o variabile. Facilita la portabilità e la leggibilità del codice, dato che tale operatore viene valutato in fase di compilazione e può variare da macchina a macchina.

Conversioni di tipo

Si può convertire un valore di tipo in un valore di un altro tipo. Tale azione si dice casting. C++ realizza molte conversioni automaticamente (conversioni implicite) ma ha anche operatori che permettono al programmatore di impostarle esplicitamente (conversioni esplicite). C++ converte i valori quando si assegna un valore di un tipo aritmetico a una variabile di un altro tipo aritmetico, converte i valori quando si combinano tipi misti nelle espressioni, converte i valori quando si passano argomenti alle funzioni.

Conversione implicita

I tipo fondamentali possono essere usati liberamente nelle espressioni perché le conversioni si eseguono automaticamente. Gli operatori con tipo a precisione più bassa si convertono nei tipi a precisione più alta (promozione di tipo). Conversioni aritmetiche assicurano che gli operandi di un operatore binario aritmetico o logico si convertano ad un tipo comune.

Anteprima
Vedrai una selezione di 9 pagine su 39
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 1 Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 2
Anteprima di 9 pagg. su 39.
Scarica il documento per vederlo tutto.
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 6
Anteprima di 9 pagg. su 39.
Scarica il documento per vederlo tutto.
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 11
Anteprima di 9 pagg. su 39.
Scarica il documento per vederlo tutto.
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 16
Anteprima di 9 pagg. su 39.
Scarica il documento per vederlo tutto.
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 21
Anteprima di 9 pagg. su 39.
Scarica il documento per vederlo tutto.
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 26
Anteprima di 9 pagg. su 39.
Scarica il documento per vederlo tutto.
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 31
Anteprima di 9 pagg. su 39.
Scarica il documento per vederlo tutto.
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni Pag. 36
1 su 39
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher henry0894 di informazioni apprese con la frequenza delle lezioni di Fondamenti di informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università Politecnica delle Marche - Ancona o del prof Dragoni Aldo Franco.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community