Sei sulla pagina 1di 2

Corso di Laboratorio di Programmazione A.A.

2021/2022
Primo Appello | 25.01.2022

Nome: _______________________________________

Cognome: _______________________________________

Matricola: _______________________________________

Quiz
Per ciascuna risposta, selezionare vero o falso. Una risposta corretta vale 1 punto, una risposta sbagliata
-0.25 e una risposta non data 0 punti (il totale sarà normalizzato). Riportare chiaramente la risposta data. Nel
caso la risposta non sia riportata chiaramente verranno assegnati 0 punti. Durata della prova: 90 minuti.

1) Le include guards:
● Assicurano che il compilatore processi una sola volta il file incluso dalle guards [V][F]
● Permettono che il linker conosca il nome del file incluso dalle guards [V][F]
● Sono delle direttive del preprocessore [V][F]
● Sono usate per evitare la doppia dichiarazione/definizione di funzioni e classi [V][F]

2) Le librerie dinamiche:
● Permettono di generare eseguibili self-contained [V][F]
● Possono essere ricompilate senza ricompilare gli eseguibili che le utilizzano [V][F]
● Hanno lo svantaggio di creare software che occupa molto spazio su disco [V][F]
● In windows sono caratterizzate dall’estensione .so e in Linux .dll [V][F]

3) Si consideri il Record di Attivazione (Function Activation Record):


● Contiene una copia dei parametri e le variabili locali [V][F]
● È una struttura dati che viene creata a seguito di una chiamata a funzione [V][F]
● È una struttura dati che viene impilata nel Free Store [V][F]
● Il tempo necessario per inserire il RA non è costante [V][F]

4) In C++ la keyword explicit:


● Permette di chiamare un costruttore solo con la semantica standard [V][F]
● Assicura che non ci siano conversioni implicite quando viene chiamato il costruttore [V][F]
● Viene utilizzato nella dichiarazione del costruttore di una classe [V][F]
● Viene utilizzato nella definizione del costruttore di una classe [V][F]

5) In una classe C++, il costruttore di spostamento:


● Accetta una lvalue reference come argomento [V][F]
● Compie una copia ottimizzata dei dati [V][F]
● Può accettare argomenti sia const che non const [V][F]
● Può accettare uno o più argomenti a seconda della classe [V][F]

6) Il costruttore di copia di default di una classe:


● Copia l'intero contenuto di uno std::vector membro della classe [V][F]
● Copia il contenuto di un vettore allocato dinamicamente e puntato da un puntatore membro [V][F]
● È disabilitato dalla presenza del costruttore di copia definito dal programmatore [V][F]
● È disabilitato dalla presenza del costruttore di spostamento definito dal programmatore [V][F]
7) Una funzione template:
● Possiede un campo aggiuntivo in cui è possibile passare argomenti per copia [V][F]
● Forza il compilatore a generarne una versione per ogni tipo per cui il template è specificato [V][F]
● Può essere chiamata senza specificare il template, se il tipo è deducibile dagli argomenti [V][F]
● Può avere come parametri template sia tipi che interi [V][F]

8) In relazione a un container STL, gli iteratori begin e end, restituiti dalle funzioni membro begin() e end():
● Sono sempre disponibili [V][F]
● begin punta al primo elemento, end all'ultimo elemento [V][F]
● Devono essere dereferenziati (operatore *) per poter accedere al dato contenuto [V][F]
● Possono essere uguali - ovvero: begin() == end() è true [V][F]

9) Siano dati: una classe base B e una classe derivata D, entrambe contenenti la funzione void f(), un oggetto
b di tipo B, un oggetto d di tipo D, un puntatore p di tipo B* che punta a d:
● L'inserimento di p in uno std::vector causa il fenomeno dello slicing [V][F]
● L'inserimento di d in uno std::vector causa il fenomeno dello slicing [V][F]
● La chiamata p->f() causa la chiamata di D::f() solo se la funzione è virtuale [V][F]
● La chiamata d.f() causa la chiamata di D::f() solo se la funzione è virtuale [V][F]

10) Un function object:


● È implementato tramite una classe che deve contenere l'overloading dell'operator[] [V][F]
● Permette di esprimere un predicato da fornire a un algoritmo STL [V][F]
● È una funzione in cui è definito un oggetto [V][F]
● Prevede che sia inibito il costruttore di copia [V][F]

Domande a risposta aperta


1) Definire il concetto di polimorfismo. Descrivere il polimorfismo dinamico e il polimorfismo statico
evidenziandone le differenze e gli strumenti implementativi che il C++ offre a supporto. Mostrare un
esempio di codice di classe che sfrutti il polimorfismo dinamico e un esempio di classe che sfrutti il
polimorfismo statico.

2) Descrivere le caratteristiche fondamentali degli smart pointers. Illustrare le differenze fra unique_ptr<T>
e shared_ptr<T>. Descrivere il comportamento delle seguenti funzioni della classe unique_ptr<T>:
reset() e release().

3) Definire l'aritmetica dei puntatori illustrando: 1) il concetto alla base dell'aritmetica; 2) con quali
operatori e operandi funziona; 3) due esempi di funzionamento, ciascuno corredato da codice che deve
essere commentato mediante descrizione e/o grafici.

Potrebbero piacerti anche