Lezioni (tutte) - 241021 - PDF
Document Details
Stefano Ghidoni
Tags
Summary
Lezioni (tutte) - 241021 - PDF document outlining C++ programming concepts, specifically focusing on scope and namespaces. Includes examples of global, class, and local scopes. Discusses best practices for using these concepts.
Full Transcript
Hello, world! Stefano Ghidoni Agenda Hello, world! Intro alla compilazione Hello, world #include int main(void) { std::cout z) { //... } //... x = 7; //... } Scope e namespace Ste...
Hello, world! Stefano Ghidoni Agenda Hello, world! Intro alla compilazione Hello, world #include int main(void) { std::cout z) { //... } //... x = 7; //... } Scope e namespace Stefano Ghidoni Agenda Scope Namespace Scope Lo scope è una regione del testo di un programma Ciascuna variabile è dichiarata in uno scope e valida (in scope) in esso – Dal punto della dichiarazione fino alla fine dello scope – Nomi di variabili: tanto più descrittivi quanto più lo scope è grande Obiettivo: rendere i nomi locali – "Locality is good" (BS) – Evitare interferenze (clash) Scope Tipi di scope – Globale: al di fuori di ogni altro scope Da usare con attenzione: vedi prossime slide – Scope di classe: il testo all’interno di una classe – Scope locale: all’interno di un blocco {} o nella lista degli argomenti di una funzione – Scope di statement: es., in un for-statement – Namespace: uno scope con un nome inserito nello scope globale o in un altro namespace Nuovo strumento Scope: esempio void f(int x) // f is global; x is local to f { int z = x+7; // z is local } int g(int x) { // g is global; x is local to g { int f = x+2; // f is local return 2*f; } x f: z x g: f Scope globale Scope globale Le funzioni sono spesso dichiarate e definite nello scope globale Per le variabili lo scope globale è problematico – Globale significa che la variabile è accessibile ovunque nel file sorgente (scope di file) – Ogni funzione può modificare variabili globali Nessun tipo di protezione / incapsulamento – Il debug è quasi impossibile in software reali – Codice meno espressivo Spesso usato per "semplificare" il passaggio di dati Scope annidati Scope annidati: scope definito dentro un altro scope – Situazione abbastanza frequente Possibile combinando insieme: – Varie istanze dello stesso strumento di scoping Es: due for-loop annidati – Strumenti di scoping diversi Es: funzioni in classi, … Scope annidati Blocchi annidati – Inevitabili, ma attenti ai blocchi troppo complessi – L'indentazione è importante per la leggibilità void f(int x, int y) { if (x > y){ //... } else { //... } //... } Scope annidati Funzioni nello scope di classi – Caso più frequente e più utile class C { public: void f(); void g() { //... } }; void C::f() { //... } Scope annidati Classi in classi (classi annidate) – Raramente necessario class C { public: class M { }; }; Scope annidati Classi in funzioni (classi locali) – Da evitare! – Se sembra necessario, probabilmente la funzione f è troppo lunga void f() { class L { //... }; //... } Scope annidati Funzioni in funzioni (funzioni locali o annidate) – Non sono legali in C++ void f() { void g() // illegale { //... } //... } Strumenti di scoping Strumenti di scoping Alcuni strumenti di scoping sono già noti: – Funzioni – Classi Permettono di definire "entità" senza preoccuparci di conflitti di nomi (clash) – Usiamo le funzioni per raggruppare linee di codice in un blocco – Usiamo le classi per organizzare funzioni, dati e tipi in un tipo Namespace Introduciamo ora i namespace – Costrutti dedicati allo scoping Permettono di organizzare classi, funzioni, dati e tipi dentro a uno spazio di nomi senza definire un tipo Molto utili per nomi potenzialmente usati in molte librerie – Mat, Matrix, Color, Shape,... Namespace namespace Graph_lib { struct Color { }; struct Shape { }; struct Line : Shape { }; struct Function : Shape { }; struct Text : Shape { }; //... int gui_main() { } Nessun conflitto } per Text e Line namespace TextLib { class Text { }; class Glyph { }; class Line { }; //... } Namespace Ora le classi hanno un nuovo nome: – Graph_lib::Text – TextLib::Text namespace::membro -> fully qualified name (nome completamente specificato) Namespace L'uso di namespace può appesantire il codice #include #include int main() { std::string name; std::cout > name; std::cout > s && s != "quit") { – A ogni iterazione del loop, si string stripped; string not_letters; // locale //... costruiscono stripped e not_letters Esistono fino alla fine del loop Distrutte in ordine inverso alla creazione Variabili statiche vs automatiche string program_name = "silly"; // ? vector v; // ? void f() { int local_auto = 0; // ? static int local_static = 0; // ? cout