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)

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

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

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

Kapitel 6 - Undantag

Innehåll. Pekare Syntax

Tommy Färnqvist, IDA, Linköpings universitet

Funktionens deklaration

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

TDDC76 - Programmering och Datastrukturer

Tentamen EDAF30 Programmering i C++

TDIU01 - Programmering i C++, grundkurs

TDDC76 - Programmering och Datastrukturer

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

Classes och Interfaces, Objects och References, Initialization

Programsystemkonstruktion med C++

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

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

TDIU01 - Programmering i C++, grundkurs

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

TDIU01 - Programmering i C++, grundkurs

Tentamen EDAF30 Programmering i C++

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

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

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

Det finns många flaggor till g++,

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

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

C++-programmets beståndsdelar

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

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

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

F5: Högnivåprogrammering

F5: Högnivåprogrammering

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

Introduktion till arv

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

Tentamen C++-programmering

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

TDIU01 Programmering i C++

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.

Programsystemkonstruktion med C++

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

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

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

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

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

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

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

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

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

Föreläsning 10. Pekare (Pointers)

Tentamen i DD2387 Programsystemkonstruktion med C++

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

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

Skizz till en enkel databas

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

maxlist-1. Indexerad lista Länkad lista

TDDC76 - Programmering och Datastrukturer

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

Poster ( structar ) Postdeklarationer

SP:PROG3 HT12 Tenta

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

Tillämpad programmering

Skapa, kopiera och destruera klassobjekt

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

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

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

Grundkurs Programmering

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

Att använda pekare i. C-kod

Typkonvertering. Java versus C

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

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

Transkript:

Innehåll EDAF30 Programmering i C++ Avslutning. Sammanfattning och frågor 1 Syntax, förklaringar Sven Gestegård Robertz Datavetenskap, LTH 2016 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/27 Syntax, förklaringar Avslutning. Sammanfattning och frågor 4/27 Most vexing parse Exempel 1 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 () Most vexing parse Exempel 2 struct Foo ; struct Bar Bar(Foo f) :xf.x ; # ifdef ERROR2 Bar b(foo ()); // funktionsdeklaration # else Bar bfoo (); // 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 (*)()) Syntax, förklaringar Avslutning. Sammanfattning och frågor 5/27 Syntax, förklaringar Avslutning. Sammanfattning och frågor 6/27

Most vexing parse Exempel: faktisk funktion 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 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. Syntax, förklaringar Avslutning. Sammanfattning och frågor 7/27 Avslutning. Sammanfattning och frågor 8/27 Exempel: allokering på stacken 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 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 Avslutning. Sammanfattning och frågor 9/27 : Stack-allokering Avslutning. Sammanfattning och frågor 10/27 Dynamiskt minne, allokering på heapen, eller i free store 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; ä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. : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 11/27 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 12/27

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 Exempel: misslyckad read_line char * read_line () char temp [80] ; cin. getline (temp, 80); return temp ; void exempel () char * namn = read_line (); *p = Z ; // Fel! Z skrivs till en slumpvis vald adress cin. getline (p, 80); // Ger (nä stan ) garanterat exekveringsfel // (" Segmentation fault ") eller // minneskorruption " Dangling pointer ": pekare till objekt som inte lä ngre finns : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 13/27 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 14/27 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! 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; : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 15/27 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 16/27 Annat vanligt fel struct Vektor Vektor ( size_t sz) :size sz,pnew int [sz ] ~ Vektor () delete [] p; 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 ; size_t size ; int * p; for ( size_t i=0; i!= v.size ; ++i) void test1 () Vektor v (10); fill (v,7); fill (v,17); void fill ( Vektor v, int val) for ( size_t i=0; i!= v.size ; ++i) v.p[i] = val; 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 17/27 : Heap-allokering: new och delete Avslutning. Sammanfattning och frågor 18/27

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 19/27 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 20/27 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() 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 Avslutning. Sammanfattning och frågor 21/27 Avslutning. Sammanfattning och frågor 22/27 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& 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) Avslutning. Sammanfattning och frågor 23/27 Avslutning. Sammanfattning och frågor 24/27

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 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 Avslutning. Sammanfattning och frågor 25/27 Avslutning. Sammanfattning och frågor 26/27 Skriv enkel kod som är korrekt och går att förstå Lycka till på tentan Frågor? Avslutning. Sammanfattning och frågor 27/27