Innehåll. Pekare Exempel

Relevanta dokument
Innehåll. Pekare Exempel

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Dynamisk bindning och polymorfism

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Tentamen EDAF30 Programmering i C++

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Kapitel 6 - Undantag

Innehåll. Pekare Syntax

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen EDAF30 Programmering i C++

Funktionens deklaration

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

TDDC76 - Programmering och Datastrukturer

Programsystemkonstruktion med C++

TDIU01 - Programmering i C++, grundkurs

Det finns många flaggor till g++,

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

TDDC76 - Programmering och Datastrukturer

Classes och Interfaces, Objects och References, Initialization

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

TDIU01 - Programmering i C++, grundkurs

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

TDIU01 - Programmering i C++, grundkurs

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Tentamen EDAF30 Programmering i C++

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

C++-programmets beståndsdelar

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

Övning från förra gången: readword

DD2387 Programsystemkonstruktion med C++ Tentamen 2

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Föreläsning 6: Metoder och fält (arrays)

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Introduktion till arv

Programsystemkonstruktion med C++

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

TDIU01 Programmering i C++

Tentamen C++-programmering

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Föreläsning 10. Pekare (Pointers)

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

grundläggande C++, funktioner m.m.

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Tillämpad programmering

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Tentamen i DD2387 Programsystemkonstruktion med C++

Poster ( structar ) Postdeklarationer

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Skizz till en enkel databas

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

maxlist-1. Indexerad lista Länkad lista

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

SP:PROG3 HT12 Tenta

Transkript:

Innehåll EDAF30 Programmering i C++ Avslutning. Sammanfattning och frågor 1 Syntax, förklaringar Sven Gestegård Robertz Datavetenskap, LTH 2017 2 Stack-allokering Heap-allokering: new och delete 3 Avslutning. Sammanfattning och frågor 2/1 Pekare Syntax Pekare Exempel struct Foo Foo * ptr ; // Deklaration av en pekare till Foo Foo object ; // Deklaration av en foo - instans ptr = & object ; // ptr tilldelas adressen till object // " ptr pekar på object " Två sätt att komma åt medlemmen x i object, genom pekaren: int x1 = (* ptr ).x; int x2 = ptr ->x; ptr är en pekare, *ptr är objektet som ptr pekar på struct Foo ; void assign17 (Foo* f) f->x = 17; void test () Foo test ; test.x = 10; assign17 ( & test ); Syntax, förklaringar Avslutning. Sammanfattning och frågor 3/28 Syntax, förklaringar Avslutning. Sammanfattning och frågor 4/28 Deklarationer och parenteser Most vexing parse Exempel 1 Parenteser spelar roll vid deklarationer av pekare till arrayer och funktionspekare int *a[10] deklarerar a som en array av int* int (*a)[10] deklarerar a som en pekare till int[10] int (*f)(int) deklarerar f som pekare till funktion int int MEN får användas överallt struct Foo ; Foo test ; Foo ( foo ); int (y); int (z )17; int (q ): struct Foo ; # ifdef ERROR1 Foo f(); // funktionsdeklaration # else Foo f; // variabeldeklaration C ++11 // Foo f; //C ++98 (men inte initierat ) # endif cout << f.x << endl ; // Fel Foo g = Foo (); // OK // C ++11: auto g = Foo (); cout << g.x << endl ; error : request for member x in f, which is of non - class type Foo () Syntax, förklaringar Avslutning. Sammanfattning och frågor 5/28 Syntax, förklaringar Avslutning. Sammanfattning och frågor 6/28

Most vexing parse Exempel 2 Most vexing parse Exempel: faktisk funktion struct Foo ; struct Bar Bar ( Foo f) :xf.x ; # ifdef ERROR2 Bar b( Foo ()); // funktionsdeklaration # else Bar b Foo (); // variabeldeklaration (C ++11) // Bar b(( Foo ())); // C ++98 : extra parenteser --> uttryck # endif cout << b.x << endl ; // FEL! error : request for member x in b, which is of non - class type Bar ( Foo (*)()) struct Foo Foo(int i=0) :xi ; struct Bar Bar(Foo f) :xf.x ; Bar b(foo ()) ; // forward declaration Foo make_foo () return Foo (17); Bar b(foo (*f )()) return Bar(f ()); void test () Bar tmp = b( make_foo ); cout << tmp.x << endl ; 17 Syntax, förklaringar Avslutning. Sammanfattning och frågor 7/28 Syntax, förklaringar Avslutning. Sammanfattning och frågor 8/28 Två sorters minnesallokering: på stacken - automatiska variabler. Förstörs när programmet lämnar det block där de deklarerats. på heapen - dynamiskt allokerade variabler. Överlever tills de explicit avallokeras. Två Tre sorters minnesallokering: på stacken - automatiska variabler. Förstörs när programmet lämnar det block där de deklarerats. Initieras inte automatiskt på heapen - dynamiskt allokerade variabler. Överlever tills de explicit avallokeras. Initieras inte automatiskt static storage duration - hela programmets exekvering. lokala variabler (deklarerade static i en funktion). bara synliga inom filen (static eller const i file scope): internal linkage globala variabler (deklarerade i file scope) t ex extern const int fortytwo = 42; external linkage Initieras till noll om ingen explicit initiering görs Avslutning. Sammanfattning och frågor 9/28 Avslutning. Sammanfattning och frågor 10/28 Exempel: allokering på stacken Dynamiskt minne, allokering på heapen, eller i free store unsigned fac ( unsigned n) if(n == 0) return 1; else return n * fac (n -1); unsigned f = fac (2); cout << f; return 0; main()... unsigned f: int tmp0: fac()... unsigned n: 2 unsigned tmp0: fac() fac()... unsigned n: 1 unsigned tmp0:... unsigned n: 0 Utrymme för dynamiska variabler allokeras med new double * pd = new double ; // allokera en double *pd = 3.141592654; // tilldela ett värde float * px; float * py; px = new float [20]; // allokera array py = new float [20] 1.1, 2.2, 3.3; // allokera och initiera Minne frigörs med delete delete pd; delete [] px; // [] krävs för C- array delete [] py; : Stack-allokering Avslutning. Sammanfattning och frågor 11/28 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 12/28

ägarskap för resurser För dynamiskt allokerade objekt är ägarskap viktigt Ett objekt eller en funktion kan äga ett objekt Ägaren är ansvarig för att avallokera objektet Om du har en pekare måste du veta vem som äger objektet den pekar på Ägarskap kan överföras vid funktionsanrop men måste inte var tydlig Varje gång du skriver new är du ansvarig för att någon kommer att göra delete när objektet inte ska användas mer. Typiskt misstag: Att glömma allokera minne char namn [80]; * namn = Z ; // Ok, namn allokerad på stacken. Ger namn [0]= Z char *p; // Oinitierad pekare // Ingen varning vid kompilering *p = Z ; // Fel! Z skrivs till en slumpvis vald adress cin. getline (p, 80); // Ger (nä stan ) garanterat exekveringsfel // (" Segmentation fault ") eller // minneskorruption : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 13/28 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 14/28 Exempel: misslyckad read_line char * read_line () char temp [80] ; cin. getline (temp, 80); return temp ; void exempel () char * namn = read_line (); " Dangling pointer ": pekare till objekt som inte lä ngre finns Delvis korrigerad version av read_line char * read_line () char temp [80]; cin. getline (temp, 80); char *res = new char [ strlen (temp )+1]; strcpy (res, temp ); return res; // Dynamiskt allokerat ö verlever void exempel () char * namn = read_line (); Fungerar, men minnesläcka! : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 15/28 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 16/28 Ytterligare korrigerad version av read_line char * read_line () char temp [80]; cin. getline (temp, 80); char *res = new char [ strlen (temp )+1] ; strcpy (res, temp ); return res ; // Dynamiskt allokerat ö verlever void exempel () char * namn = read_line (); // Ta över ägarskap av sträng delete [] namn ; // Avallokera str ä ngarna delete [] ort ; Annat vanligt fel struct Vektor Vektor ( size_t sz) :size sz,pnew int [sz ] ~ Vektor () delete [] p; ; size_t size ; int * p; for ( size_t i=0; i!= v.size ; ++i) void fill ( Vektor v, int val) for ( size_t i=0; i!= v.size ; ++i) v.p[i] = val; void test1 () Vektor v (10); fill (v,7); fill (v,17); Vad skrivs ut? 0 0 7 7 7 7 7 7 7 7 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 17/28 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 18/28

Annat vanligt fel struct Vektor Vektor ( size_t sz) :size sz,pnew int [sz ] ~ Vektor () delete [] p; ; size_t size ; int * p; for ( size_t i =0; i!= v.size ; ++i) void fill ( Vektor v, int val ) for ( size_t i =0; i!= v.size ; ++i) v.p[i] = val ; void test1 () Vektor v (10); fill (v,7); fill (v,17); 0 0 7 7 7 7 7 7 7 7 *** Error : double free or corruption ( fasttop ): 0 x0000000002138010 *** : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 19/28 Annat vanligt fel: värdeanrop och brott mot rule of three Problem: void fill ( Vektor v, int val) for ( size_t i=0; i!= v.size ; ++i) v.p[i] = val; for ( size_t i=0; i!= v.size ; ++i) fill och print värdeanropas värdet av pekaren Vektor::p kopieras destruktorn körs efter första anropet av fill delete[] p v.p (i test1()) blir dangling pointer Lösning? : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 20/28 Annat vanligt fel: värdeanrop och brott mot rule of three Problem: fill och print värdeanropas värdet av pekaren Vektor::p kopieras destruktorn körs efter första anropet av fill delete[] p v.p (i test1()) blir dangling pointer Lösningar: ändra till referensanrop:void fill(vektor&, int), void print(const Vektor&, int) Fungerar för både print och fill Rule of three: implementera copy-constructor och operator=. Undviker dubbel delete och dangling pointer Både värde- och referensanrop fungerar i print fill måste ha en utparameter referensanrop Det säkra är att göra båda. : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 21/28 resurshantering resurshantering: RAII och rule of three (five) undvik nakna new och delete Använd konstruktorer till att säkerställa invarianter kasta exception om det misslyckas för polymorfa klasser Kopiering leder ofta till katastrof. =delete Copy/Move-constructor Copy/Move-assignment Om kopiering behövs, implementera en virtuell clone() Avslutning. Sammanfattning och frågor 22/28 klasser skapa bara medlemsfunktioner för sådant som behöver tillgång till representationen som default, gör konstruktorer med en parameter explicit gör bara funktioner virtual om du vill ha polymorfism polymorfa klasser åtkomst genom referens eller pekare En klass som har virtuella funktioner ska ha en virtuell destruktor använd dynamic_cast om du behöver navigera klasshierarkin använd override för tydlighet och för att få hjälp av kompilatorn att hitta fel parametrar och returvärden, reasonable defaults return by value om inte mycket dyrt att kopiera använd referens-anrop om inte mycket billigt att kopiera in-parametrar: const T& in/ut- eller ut-parametrar: T& Avslutning. Sammanfattning och frågor 23/28 Avslutning. Sammanfattning och frågor 24/28

säkrare kod initiera alla variabler använd exceptions istället för felkoder använd named casts (om du måste typomvandla) använd bara union som implementationsteknik inuti klasser undvik pekararitmetik, utom för trivial array-traversering (t ex p++) i väldigt specialiserad kod (t ex implementation av minneshanterare) standardbiblioteket använd standard-biblioteket om möjligt standard-containers standard-algoritmer använd hellre std::string än C-strängar (char[]) använd hellre containers (t ex std::vector<t>) än arrayer (T[]) Ofta både säkrare och effektivare än egenskriven kod Avslutning. Sammanfattning och frågor 25/28 Avslutning. Sammanfattning och frågor 26/28 Skriv enkel kod som är korrekt och går att förstå standardbibliotekets container-klasser använd std::vector som default använd std::forward_list för sekvenser som ofta är tomma var uppmärksam på när iteratorer blir ogiltiga använd at() istället för [] för att få index-kontroll använd range for för enkla traverseringar initiering: använd () för storlekar och för listor av element Lycka till på tentan Frågor? Avslutning. Sammanfattning och frågor 27/28 Avslutning. Sammanfattning och frågor 28/28