01 CPP Intro Linguaggio W
01 CPP Intro Linguaggio W
C
1972 1983-1998
Dennis Ritchie Bjarne Stroustrup
Bell Laboratories
Bell Laboratories
C++
Programmazione C++ 2
Breve storia del C++
Gli antenati - Simula
◆SIMULA
⚫ Basato su Algol60
⚫ Progettato per simulare eventi discreti
▪ Esteso per diventare un linguaggio di programmazione
⚫ Aspetti negativi
▪ Troppo complicato, poca documentazione
▪ Eseguibili molto grandi
▪ Compilazione monolitica
Programmazione C++ 3
Breve storia del C++
Gli antenati – C
◆C
⚫ Introduzione di un preprocessore
⚫ Compilazione separata dei file
⚫ Astrae l’architettura HW… ma non troppo
▪ Gestione memoria tramite puntatori
▪ Diversi tipi di dati : unsigned, long, enumeration, …
▪ Dati aggregati: union, struct
▪ Conversione di tipo esplicita (cast)
▪ “Portable I/O package” poi diventato “standard I/O library”
Programmazione C++ 4
Breve storia del C++
1983: Il C++ (Bjarne Stroustrup) (1)
◆C++
⚫ Piena compatibilità con il C
▪ C++ : superset del C
⚫ Exception handling
⚫ Overloading degli Operatori
⚫ Standard Template Library (STL)
Programmazione C++ 5
Breve storia del C++
1983: Il C++ (Bjarne Stroustrup) (2)
Programmazione C++ 6
Breve storia del C++
1983: Il C++ (Bjarne Stroustrup) (3)
Procedural programming
“Decide which procedures you want; use the best algorithms you can find.”
void some_function(double v) {
double root2=sqrt(2);
double val=root2*v+1.65;
}
void some_other_function() {
// some code
}
...
Programmazione C++ 7
Breve storia del C++
1983: Il C++ (Bjarne Stroustrup) (4)
Modular programming
“Decide which modules you want; partition the program so that data is hidden within modules.”
utils.h
Programmazione C++ 8
Breve storia del C++
1983: Il C++ (Bjarne Stroustrup) (5)
Programmazione C++ 9
Breve storia del C++
1983: Il C++ (Bjarne Stroustrup) (6)
Generic programming
“Decide which algorithms you want; parameterize them so that they work for a variety of suitable types and data
structures.”
template <class T> class Stack { // A generic concrete type
// ...
public:
void push(T value) {...}
T pop() {...}
Programmazione C++ 10
Breve storia del C++
1983: Il C++ (Bjarne Stroustrup) (7)
“C++ is designed to give the programmer choice, even if this makes it possible for the
programmer to choose incorrectly”
“C++ avoids features that are platform specific or not general purpose”
“C++ does not incur overhead for features that are not used”
Programmazione C++ 11
Breve storia del C++
2011/2014: C++11, C++14
◆Estensioni al Linguaggio
⚫ Multitasking utilities, parallel execution, atomic operations, nullptr constant, delegation, initializer_list,
funzioni lambda, automatic type deduction, ...
// Type inference
int some_int;
decltype(some_int) other_integer_variable = 5;
auto other_variable = some_function(…);
// Initializer list
SequenceClass some_var = {1, 4, 5, 6};
Programmazione C++ 12
Breve storia del C++
2017: C++17
◆Estensioni al Linguaggio
⚫ Type deduction per le classi, easy nested namespace, inizializzazioni negli if e switch,…
#include <any>
#include <iostream>
// any type
std::any a = 1;
std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n'; // i: 1
a = 3.14;
std::cout << a.type().name() << ": " << std::any_cast<double>(a) << '\n'; // d: 3.14
a = true;
std::cout << a.type().name() << ": " << std::any_cast<bool>(a) << '\n'; // b: 1 (true)
Programmazione C++ 13
Breve storia del C++
2020: C++20
◆Estensioni al Linguaggio
⚫ Concepts, three-way comparison <=>, modules,…
// helloworld.cpp
export module helloworld; // module declaration
import <iostream>; // import declaration
export void hello() // export declaration
{
std::cout << "Hello world!\n";
}
// main.cpp
import helloworld; // import declaration
int main() {
hello();
}
Programmazione C++ 14
C++
Osservazioni: Pro
◆Diversi stili di programmazione
⚫ Lo stile di programmazione giusto per il compito giusto
▪ Da procedurale puro a Object-Oriented puro
◆Librerie essenziali
Programmazione C++ 15
C++
Osservazioni: Contro
◆La massima flessibilità può portare a scrivere codice ibrido
Programmazione C++ 16
Processo di Compilazione
JAVA
Compilatore
JVM - JRE
Class Loader
Just-in-Time
Interpreter
Compiler
Portabilità a livello
di Bytecode
Eseguibile
Programmazione C++ 17
Processo di Compilazione
C/C++
Sorgente .cpp / .cc Sorgente .cpp / .cc
Preprocessore Preprocessore
Unità di Unità di
compilazione ... compilazione
Compilatore Compilatore
Librerie Linker
Portabilità a livello
di codice sorgente
Eseguibile
Programmazione C++ 18
Processo di Compilazione
Preprocessore (1)
Programmazione C++ 19
Processo di Compilazione
Preprocessore (2)
File1 Unità di compilazione:File1
double k=FUNZ(j);
Al Compilatore
File2 Compilatore
int v1;
double v2; NOTA: #include ha due forme
char v3;
#include “filename”
#include <filename>
Programmazione C++ 20
Processo di Compilazione
Compilatore
◆Operazioni
⚫ Analisi sintattica del codice sorgente
⚫ Analisi semantica
▪ Type Checking
▪ Controllo uso / inizializzazione variabili
▪ Identifica simboli (variabili, funzioni) esterni (senza implementazione)
⚫ Generazione Codice
▪ Allocazione storage
▪ Istruzioni
▪ Inclusione informazioni di debug
⚫ Ottimizzazione Codice
▪ File oggetto (.obj)
Programmazione C++ 21
Processo di Compilazione
Linker
◆Operazioni
⚫ Risolve i riferimenti a simboli (variabili, funzioni) esterni
▪ Cerca nei vari file oggetto l’implementazione
▪ Cerca nelle librerie esterne l’implementazione
▪ Collega (Link) il simbolo con la sua implementazione (indirizzo)
▪ Errore tipico : “Unresolved External Symbol”
Programmazione C++ 22
Processo di Compilazione
I file sorgente
⚫ .h
▪ Contengono le dichiarazioni di funzioni, tipi di dati (classi e simili), variabili, ...
▪ Possono essere visti come file di interfaccia di una libreria (es: cosa contiene il corrispondente
.cpp)
▪ Sono inclusi dai file .cpp (e altri file .h) per conoscere l’interfaccia di ciò che viene usato
Programmazione C++ 23
Processo di Compilazione
Esempio di compilazione (1)
// Funzioni Globali
double f1(double v)
{
...
}
// usa f3()
...
}
void f3(int v)
{
...
}
...
Programmazione C++ 24
Processo di Compilazione
Esempio di compilazione (1)
// Funzioni Globali
double f1(double v)
{ Compilatore genera codice della funzione.
...
}
// usa f3()
...
}
void f3(int v)
{
...
}
...
Programmazione C++ 25
Processo di Compilazione
Esempio di compilazione (1)
// Funzioni Globali
double f1(double v)
{ Compilatore genera codice della funzione.
...
}
void f3(int v)
{
...
}
...
Programmazione C++ 26
Processo di Compilazione
Esempio di compilazione (1)
// Funzioni Globali
double f1(double v)
{ Compilatore genera codice della funzione.
...
}
Programmazione C++ 27
Processo di Compilazione
Esempio di compilazione (2)
file.cpp
// usa f3()
...
}
void f3(int v)
{
...
}
...
Programmazione C++ 28
Processo di Compilazione
Esempio di compilazione (2)
file.cpp
// usa f3()
...
}
Compilatore genera codice per una chiamata
void f3(int v)
{ a funzione.
... Il linker realizzerà il collegamento effettivo
} con il codice.
...
Programmazione C++ 29
Processo di Compilazione
Esempio di compilazione (3)
file.cpp file.h
// usa f3()
...
}
void f3(int v)
{
...
}
...
Programmazione C++ 30
Processo di Compilazione
Esempio di compilazione (4)
ops.h
...
Programmazione C++ 31
Processo di Compilazione
Esempio di compilazione (4)
ops.h
...
Programmazione C++ 32
Processo di Compilazione
Esempio di compilazione (4)
ops.h
...
Programmazione C++ 33
Processo di Compilazione
Esempio di compilazione (4)
ops.h
...
Programmazione C++ 34
Processo di Compilazione
Esempio di compilazione (5)
io.h
ops.h
common.h
#include “common.h”
...
void xyz();
... ops.cpp
common.cpp
#include “ops.h”
...
...
Programmazione C++ 35
Processo di Compilazione
Esempio di compilazione (5)
io.h
ops.h
common.h
#include “common.h”
...
void xyz();
... ops.cpp
common.cpp
#include “ops.h”
...
...
Programmazione C++ 36
Processo di Compilazione
Esempio di compilazione (5)
io.h
ops.h
common.h
#include “common.h”
...
void xyz();
... ops.cpp
common.cpp
#include “ops.h”
...
...
Programmazione C++ 37
Processo di Compilazione
Esempio di compilazione (5)
io.h
ops.h
common.h
#include “common.h”
...
void xyz();
... ops.cpp
common.cpp
#include “ops.h”
...
...
Programmazione C++ 38
Processo di Compilazione
Esempio di compilazione (5)
io.h
ops.h
common.h
#include “common.h”
...
void xyz();
... ops.cpp
common.cpp
#include “ops.h”
...
...
Programmazione C++ 39
Processo di Compilazione
Le guardie nel .h (1)
ops.h
#include “common.h”
Preprocessore
// Contenuto di ops.h
file.cpp
// Contenuto di common.h
// Contenuto di io.h
// Contenuto di common.h
// Contenuto di ops.h
// Contenuto di file.cpp
Programmazione C++ 40
Processo di Compilazione
Le guardie nel .h (2)
ops.h
#include “common.h”
Preprocessore
// Contenuto di ops.h
file.cpp
//
//
Contenuto
Contenuto
di
di
common.h
io.h
◆Definizione di guardie nei .h
// Contenuto di ops.h
// Contenuto di file.cpp ⚫ Evita inclusioni multiple
Programmazione C++ 41
Processo di Compilazione
Le guardie nel .h (3)
Preprocessore
ops.h
#ifndef ops_H
OGNI FILE “.h”
#define ops_H DEVE AVERE LE
file.cpp #include “common.h” GUARDIE!
// Contenuto di common // Contenuto di ops.h
// Contenuto di io #endif
// Contenuto di ops
// Contenuto di file
Programmazione C++ 42
Processo di Compilazione
Compilazione separata
◆Se un file .cpp cambia ma non il corrispondente file .h (es. un algoritmo è re-
implementato in modo più efficiente)
⚫ Non è necessario ricompilare gli altri file .cpp
Programmazione C++ 43
Processo di Compilazione
Compilazione separata
◆E’ possibile includere qualunque file con la direttiva #include, anche un .cpp
file.h
file.h io.h
file.cpp
file.cpp #include “common.h”
...
#include “file.h” io.cpp #include “file.h”
#include “io.cpp”
... #include “io.h” #include “io.h”
... ...
...
Programmazione C++ 44
Processo di Compilazione
”Nascondere” una definizione
ops.h
file.cpp
Programmazione C++ 45
Il linguaggio C++
Definizioni e Dichiarazioni
UNA DEFINIZIONE E’
◆ Funzioni ANCHE UNA DICHIARAZIONE
⚫ Definizione
⚫ Dichiarazione
◆ Variabili
⚫ Definizione
⚫ Dichiarazione
Programmazione C++ 46
Il linguaggio C++
Definizioni e Dichiarazioni
UNA DEFINIZIONE E’
◆ Funzioni ANCHE UNA DICHIARAZIONE
⚫ Definizione
tipo_ritorno nome(tipo1 var1, tipo2 var2)
{
// codice
}
⚫ Dichiarazione
◆ Variabili
⚫ Definizione
⚫ Dichiarazione
Programmazione C++ 47
Il linguaggio C++
Definizioni e Dichiarazioni
UNA DEFINIZIONE E’
◆ Funzioni ANCHE UNA DICHIARAZIONE
⚫ Definizione
tipo_ritorno nome(tipo1 var1, tipo2 var2)
{
// codice
}
⚫ Dichiarazione
tipo_ritorno nome(tipo1 var1, tipo2 var2);
◆ Variabili
⚫ Definizione
⚫ Dichiarazione
Programmazione C++ 48
Il linguaggio C++
Definizioni e Dichiarazioni
UNA DEFINIZIONE E’
◆ Funzioni ANCHE UNA DICHIARAZIONE
⚫ Definizione
tipo_ritorno nome(tipo1 var1, tipo2 var2)
{
// codice
}
⚫ Dichiarazione
tipo_ritorno nome(tipo1 var1, tipo2 var2);
◆ Variabili
⚫ Definizione
tipo1 nome1;
tipo2 nome2=valore; // inizializzazione
⚫ Dichiarazione
Programmazione C++ 49
Il linguaggio C++
Definizioni e Dichiarazioni
UNA DEFINIZIONE E’
◆ Funzioni ANCHE UNA DICHIARAZIONE
⚫ Definizione
tipo_ritorno nome(tipo1 var1, tipo2 var2)
{
// codice
}
⚫ Dichiarazione
tipo_ritorno nome(tipo1 var1, tipo2 var2);
◆ Variabili
⚫ Definizione
tipo1 nome1;
tipo2 nome2=valore; // inizializzazione
⚫ Dichiarazione
extern tipo nome; // definizione esterna all’unità
// di compilazione corrente
Programmazione C++ 50
Il linguaggio C++
Definizioni e Dichiarazioni
file1.cpp file2.cpp
double pluto() {
...
}
double pluto() {
...
}
Programmazione C++ 51
Il linguaggio C++
Riassumendo…
◆Nei file .h
⚫ Dichiarazioni di funzionalità condivise tra diverse unità di compilazione
◆Un file .cpp NON conosce cosa contiene un altro file .cpp fino a che non include
le sue dichiarazioni
◆Mettere sempre le guardie nei file .h
Programmazione C++ 52
Il linguaggio C++
Funzione Main
Programmazione C++ 53
Il linguaggio C++
Input/Output base (std::cout)
#include <iostream>
int main()
{
std::cout << “Hello World”; //output su console
return 0;
}
Programmazione C++ 54
Il linguaggio C++
Input/Output base (std::cin)
◆ Input da tastiera
⚫ ‘std::cin’ è un oggetto predefinito per leggere caratteri dallo standard input (tastiera)
▪ Bisogna includere il file di libreria <iostream>
▪ Si usa l’operatore ‘>>’
#include <iostream>
int main()
{
int numero;
return 0;
}
Programmazione C++ 55
Il linguaggio C++
Input/Output base (std::cerr)
◆ Output d’errore
⚫ ‘std::cerr’ è un oggetto predefinito per scrivere caratteri sullo standard error stream
(console)
▪ Bisogna includere il file di libreria <iostream>
▪ Si usa l’operatore ‘<<’
#include <iostream>
int main()
{
std::cerr << “Errore!”; //output su console
return 0;
}
Programmazione C++ 56
Il linguaggio C++
#include <iostream>
using namespace std;
int main()
{
int numero;
return 0;
}
Programmazione C++ 57
Le librerie del C++
Standard (1)
#include <math.h>
...
sqrt(10); // Ok
std::sqrt(10); // Errore
...
Programmazione C++ 58
Le librerie del C++
Standard (2)
◆I file header delle librerie C -> C++ (elementi definiti sia nel global namepace
che in std)
⚫ <cmath> / <cstring> / ...
#include <cmath>
...
sqrt(10); // Ok
std::sqrt(10); // Ok
...
Programmazione C++ 59
Le librerie del C++
Standard (3)
◆I file header delle librerie C++ (elementi definiti nel namespace std)
⚫ <iostream> / <string> / ...
#include <string>
...
string s; // Errore
std::string ss; // Ok
...
Programmazione C++ 60
Le librerie del C++
Standard Template Library
◆Containers
◆Iteratori
#include <vector>
...
vector<int> v; // Errore
std::vector<int> vv; // Ok
...
Programmazione C++ 61