C++ -> Linguaggio ad alto livello
Commenti
-> ignorati dal compilatore
// per commento di 1 riga
/* */ per commento di blocco
Identificatori
- Variabili: contengono il valore di un qualche tipo -> valore -> cambia nel tempo
- Costanti: simbolo -> identificano valori che non cambiano nel tempo -> tipo -> non cambia
- Etiacche: utilizzate da goto
- Tipi definiti dal programmatore: costruiti da tipi primitivi
- Funzioni: indicano il sottoprogramma
Keywords
Parole chiave cui significato è prestabilito, non possono essere usate come identificatori.
Intero
- Senza cifre decimali (con e senza segno) -> int, long int, unsigned long int
- O negativo o intero a cero, o al massimo postivo...
- Se più valori si vuole usare 0 o 1. Se non viene specificato il compilatore sceglie il tipo più piccolo possibile per conservare Float (f + F) o long double (l + L)
Operassegnamento
- Op += Prime valore ia espresso: ovv esempi sopraprogrammazione -> a vx
- Opera ++ e ---> postiposta esegue esame, dopo esecuzione il valore (gia incrementata)
Operatore ternario
Cond ? expr1 : expr2 -> Se cond è vera -> expr1 altrimenti -> expr2
Break e Continue
- Miglior controllo sui cicli
- Break -> dentro ciclo o switch, ne causa la eliminazione -> Controllo passato o sei successiva al ciclo
- Continue -> solo nei cicli, causa l'interruzione della corrente esecuzione del corpo del ciclo -> Controllo passato alla prima fine del capo del ciclo
Dichiarazioni
- Ogni identificatore deve essere dichiarato
- Contenente di stack/area persistenza necessaria
- Determinare l'interpretazione da attribuire al var. bit.
- Permette al compilatore di determinare errie errori semantici
- Dichiarazioni più determinazione di ottenere un var
- Determina il tipo di parametri: e il tipo del valore restituisto
- Consente compilatore per determinare errori semantici
E.g:
- VARIABILI - COSTANTI - TIPI
Scope e Lifetime
- Dichiarazione variabile: -> si estende dal anno immediatamente più vicino fino alla fine del blocco di istruzioni in cui viene inserito.
- Operare -> risolve il blocco cui referisce alla dichiarazione globale di un identificatore
- Lifetime -> variabile vive esattamente dal notificarla e distrutta alla fine del blocco dove è passa la dichiarazione
Array
- Array -> permette di raccogliere nello stesso nome variabili dello stesso tipo -> Multidimensional collegabili -> array o matrici
char x[1-10] -> lunghezza [0]-10 carattere nella
No infrerire l'operazione di assegnamento
C++ -> linguaggio ad indirizzo
Commenti
// -> ignorati dal compilatore
Identificatori
- Variabili: Contenitori di valori di un qualche tipo - valore -> cambia nel tempo
- Costanti: Sintattico - identificano valori che non cambiano nel tempo - tipo -> non cambia
- Etichette: Utilizzato da goto
- Tipi definiti dal programmatore: costrutti della tipi primitive
- Funzioni: indicano sottoprogrammi
Keywords
Parole chiave cui significato è prestabilito; non possono essere usate come identificatori.
Intero
- Senza cifra decimale (con o senza segno) -> int, long int, unsigned long int
- Ogni numero intero o in ottale o in esadecimale
- Virgola mobile e double e float (f, F) o long double (l, L)
Operatore di assegnamento
- Op += prefissa -> prima esegue l'esame, poi esegue assegnamento a sx
- Op = postfissa -> esegue l'esame dopo l'esecuzione a il valore (gia incrementato)
Operatore ternario
Condi ? expr1 : expr2 -> se condi è vera -> expr1 altrimenti -> expr2
Break & Continue
Miglior controllo sui cicli
- Break -> dentro ciclo o switch, ne causa la terminazione -> controllo passato a istr. successiva al ciclo.
- Continue -> solo nei cicli, causa l’interruzione della corrente esecuzione del corpo del ciclo
Dichiarazioni
- Ogni identificatore deve essere dichiarato
- Contenuti di stack/heap variabili necessarie
- Determinare l’inizializzazione da ottenere su variabili
Scopo & Lifetime
Dichiarazione variabile: -> si estende dal punto immediatamente più vicino fino alla fine del blocco di istruzioni in cui appare; operatore -> risoluzione di breve intervallo di riferirsi alla dichiarazione globale di un identificatore
Array
Permette di raccogliere nello stesso nome più variabili dello stesso tipo
- Multi-dimensionali: logging (o matrici)
- char c[] = "ciao" -> lunghezza = (n+1)
STRUCT
Per racchiudere più elementi in un unico:
Struct e array
persona [2]: 5 → {5*30B} = 300B
amico3: 300B
struct persona { char nome[20]; int età; };
struct dentro struct struct Data { int anno, int mese; } struct persona pippo { char nome[20]; int età; Data dataNas; }; persona pippo = {"pippo", 20}; pippo.nome[0], pippo.datanas.mese
Si definisce l'operatore di assegnamento Data og.data1 = {2022, 3}; Data donna = {3, 2023}; donna = op1;
UNION
Sintatticamente → Uguale a struct
I campi vengono memorizzati a partire dallo stesso indirizzo → memoria: v1. L'oggetto → quello della componente più grande
ENUMERAZIONI
→ Per poter definire insieme esplicitamente → enum nome { id1, id2, id3 }; Gli enumerazione a ciascuni identificatore una costante intera: int n=verde [r=2];
TYPEDEF
Esiste la possibilità di dichiarare un altro tipo typedef <tipo> <cost> → typedef unsigned short int OSI; Utile per creare abbreviazioni di tipo complesso → soprattutto in presenza di puntatori e funzioni
FUNZIONI
Valore di ritorno → tipo definito entro il main Definizione di funzione → si ripete la dichiarazione, del nome o dei parametri, e il tipo Parametri → Ciò che è necessario - il nome dei parametri, il tipo Se manca → Formal non mod permette acquisire il passato per comunicare Modalità di passato di output → passaggio per riferimento o puntatori
Parametri di default → int somma (int a, int b=7) → se non viene specificato valore 3
L'ultimo esame gli ultimi;
LA FUNZIONE MAIN()
Invocare automaticamente dal sistema quando il programma viene eseguito int main(char argc, char\* argv[]); usato per comunicare al SO la causa di terminazione.
argc → indice di n dei parametri sul riga di comando attraverso cui il codice eseguito programma argv → sovraspici scritte l'interessa come cercare e parametri. Il primo index del programma l'argomento sul riga del comando
FUNZIONI INLINE
→ Per non influenzare il vaiaggio della ricola funzioni Le compilazione memorizzato ccomp → quando intende la chiamata lo sostituisce alla chiamata della funzione
MACRO
#define dimensione (min, max) …
La inlin chiamato non sono → separati e prendere inline qualsiasi funzione Con funzione tipo ciao e y → Perché era e lo scopo della funzione
OVERLOADING
Sovraccaricamento → Attribuire alla stessa nome più significati; il compilatore decide quale valutare int somma (int, int) float somma (float, float)
Condizione: La nuova deve differire per tipo di numero di parametri.
Puntatori e riferimenti
int a; → puntatore a intero double *b; → puntatore a puntatore a double int *c, int *d;
a, → per ottenere l’indirizzo: &a
anche malloc(fflo di operand indicherà la zona di memoria. sono variabili. b
- !
- z per ottenere l’indirizzo:
Puntatori di array
Esempio semplificato:
- dereferenzia un puntatore nello stesso modo in una selezione di elemento di un array
- → stesso nome del primo elemento di array
int a[]={0,1,2,3,4,5}
int *ptr3 equivale a ptr={5}a0
Aeq{3} equivale a *(ptr+3)
Tipo char
char array[6]=“ciao”
char *ptr= “ciao”
cout<array>. e ok ptr
Differenza
Puntatore vs più usare l’aritemica. e usarlo come array
Il nome di un array non è un puntatore a cui è possibile assegnare un nuovo valore.
- P{t+i}
- cout «t[i]
Uso dei puntatori
1. Realizzazione strutture dati dinamiche → quando non riesce a priori la quantita di dati che si andremo a manipolare
2. Inizializzazione di variabili di oggetti passati
3. Passaggio address di parametri di grosse dimensioni
4. Rendere possible il passaggio di parametri di una funzione
LISTA
Utilizzo: puntatori, Numero massimo di elementi non definito a priori.
- Composta da celle (nucleo) tra di loro:
- each:
- La prenota: valore
- Puntatore della cella successiva
struct elem { int e; elem *next;} q = memorizza il valorenext = puntatore alla cella successiva
Creazione di un nuovo oggetto
- Allocando un nuovo blocco di memoria della heap-memory
- Si tramite l'operatore new e il tipo specificato
Distribuzione di un oggetto
- Deallocare il blocco allocato nella heap-memory
Operatori statici
Numero massimo strutture dinamiche, determinato dalla dimensione della heap-memory o da certo il limite della quantità di memoria del sistema.
Un oggetto allocato dinamicamente può essere creato in uno scopo ed essere acceduto in un altro trasmettendone l'indirizzo.
Passaggio di parametri
void change(int * p) riceve come parametro un puntatore a int, quindi riceve l'indirizzo di una cella di memoria. \n La dereferenziazione con tanti la modifica dell'oggetto, *(p) = *(p) + 1 esprime che vega vo. costante void funzione (elem p); void change(*p); *(p) = *(p) con grandi dimeso e modificia -> cambia i di esezione della funzione
Restituire un puntatore
A int* somme (int q, int s) { int res; return & res; }Se scriviamo l'indirizzo di una variabile local, viene distrutto quando la funzione termina. Soluzione: allocare la variabile fill nello heap per restituire l'indirizzo (E: ricordarsi di allocarla)
Passaggio parametri con riferimento
void funct(int & a) -> main() int a=5; fun(A); →
- I riferimenti non devono essere dereferenziati
- I riferimenti non possono essere associati ad un'altra variabile dopulare dell'inizializzazione.
Linkage
Identificatori di variabili. Costanti, funzioni possiedono linkage. Un programma può avere più file che vengono compitiati separatamente e poi linkati per ottenere un eseguibile
- F1:
- f1.cpp
- void fun() {
- int c=0
- return c;
- F3:
- f3.cpp
- extern int c
- fun(5)
- F2:
- f2.cpp
- c=0
- dichiarare e iniziare una variabile
- protinisce il valore della variabile nel file a.cpp
exterm = keyword che informa il compilatore che la variabile esiste in un altro file. Il linker provvede a collegare i file. Quindi extern sarà seguito solo da un identificatore. extern per le funzioni serve a far completare il compilatore della funzione externa int c(int);
Nomi visibili all'eserno di un file: linkage esternoidentifiers
- inte: variabili locali non interne
- nomi invocati esterni