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

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

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

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

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

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

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

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

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

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

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

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

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

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

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

TDIU01 Programmering i C++

Dynamisk bindning och polymorfism

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

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

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 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Det finns många flaggor till g++,

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

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

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

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

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

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

Introduktion till arv

Innehåll. Pekare Syntax

Programsystemkonstruktion med C++

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

TDIU01 - Programmering i C++, grundkurs

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

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

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

allokeras på stacken dynamiskt new delete

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

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

C++-programmets beståndsdelar

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

TDIU01 - Programmering i C++, grundkurs

Tentamen EDAF30 Programmering i C++

TDDC76 - Programmering och Datastrukturer

TDDC76 Programmering och datastrukturer

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

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

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

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

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Tommy Färnqvist, IDA, Linköpings universitet

TDDC76 - Programmering och Datastrukturer

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

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

5 Arv och dynamisk bindning FIGUR

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

Skapa, kopiera och destruera klassobjekt

Arv bakgrund (kap. 9)

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

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

Parameteröverföring. Exempel. Exempel. Metodkropp

1 Klasser och objektorientering Vad är objektorientering?

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

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

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

Programmering B med Visual C

TDDC76 - Programmering och Datastrukturer

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

Typkonvertering. Java versus C

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

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

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

Objektorienterad programmering Föreläsning 4

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

C++ Objektorientering - Klasser. Eric Elfving

TDIU01 - Programmering i C++, grundkurs

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Föreläsning 4 Tillägg till C-syntaxen

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

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

Polymorfi. Objektorienterad och komponentbaserad programmering

Klasshierarkier - repetition

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Transkript:

Innehåll EDAF30 Programmering i C++ Resurshantering. Objektorientering. Klasser. Sven Gestegård Robertz Datavetenskap, LTH 2015 1 Typdeklarationer och typomvandling 2 Resurshantering Stack-allokering Heap-allokering: new och delete Smarta pekare 3 Objektorientering, kort repetition Grundläggande begrepp Relationer mellan objekt Programmering 4 Klasser Klassdefinitioner Detruktorer Resurshantering. Objektorientering. Klasser. 2/1 Typdeklarationer med typedef och using Typomvandlingar (casting) Implicita Typomvandlingar typedef typedef unsigned long ulong ; typedef char rad [80]; typedef double (* funpek )( int ); Användning Följande deklarationer är ekvivalenta: ulong a [12]; rad namn ; funpek pf; using (C++ 11) using ulong = unsigned long ; using rad = char [80]; using funpek = double (*)( int ); unsigned long a [12]; char namn [80]; double (* pf )( int ); Automatiska typomvandlingar Uttryck av typen x y, för någon binär operator Ex: double + int ==> double float + long + char ==> float Tilldelningar och initieringar: Värdet i högerledet konverteras till samma datatyp som i vänsterledet Konvertering av typen hos aktuella parametrar till typen för de formella parametrarna Villkor i if-satser, etc. bool C-array pekare (array decay) 0 nullptr (tom pekare, i C++11, tidigare definierade man ofta konstanten NULL) Typdeklarationer och typomvandling Resurshantering. Objektorientering. Klasser. 3/44 Typdeklarationer och typomvandling Resurshantering. Objektorientering. Klasser. 4/44 Typomvandlingar (casting) Explicita typomvandlingar, C-stil Syntax ( typnamn ) uttryck ; // (Både i C och i C++, som i Java ) typnamn ( uttryck ); // ( Alternativ syntax i C ++) För varianten typnamn(uttryck) måste typnamn vara ett ord, d v s int *(...) eller unsigned long(...) är inte OK. Exempel char *p = ( char *) 07650; // heltal ==> pekare long i = ( long ) p; // pekare ==> heltal int x=3, y =4; double a = (( double )(x+y ))/2; unsigned char a = ( unsigned char ) -3; // 253 signed char b = ( signed char ) 1000; // -24 (3) e8 unsigned c = ( unsigned ) (signed char ) 1000; // 4294967272 Typomvandlingar (casting) Namngivna typomvandlingar static_cast<new_type> (expr) - omvandlar mellan kompatibla typer (kollar inte talområden) reinterpret_cast<new_type> (expr) - inget skyddsnät, samma som C-stil const_cast<new_type> (expr) - lägger till eller tar bort const dynamic_cast<new_type> (expr) - används för pekare till klasser. Gör typkontroll vid run-time, som i Java. Exempel char c; // 1 byte int *p = ( int *) &c; // pekar på int: 4 bytes *p = 5; // fel vid exekvering, stack - korruption int *q = static_cast <int *> (&c); // kompileringsfel Typdeklarationer och typomvandling Resurshantering. Objektorientering. Klasser. 5/44 Typdeklarationer och typomvandling Resurshantering. Objektorientering. Klasser. 6/44

Exempel: allokering på stacken 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. unsigned fac( unsigned n) if(n == 0) return 1; else return n * fac(n -1); int main () unsigned f = fac (2); cout << f; return 0; main()... unsigned f: int retval: fac()... unsigned n: 2 unsigned retval: fac() fac()... unsigned n: 1 unsigned retval:... unsigned n: 0 unsigned retval: 1 Resurshantering : Resurshantering. Objektorientering. Klasser. 7/44 Resurshantering : Stack-allokering Resurshantering. Objektorientering. Klasser. 8/44 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; Varning! se upp med parenteser Allokering av char[80] char * c = new char [80]; Nästan samma... char * c = new char (80); Nästan samma... char * c = new char 80; De två senare allokerar en byte och initierar den med värdet 80 ( P ). char * c = new char ( P ); Resurshantering : Heap-allokering: new och delete Resurshantering. Objektorientering. Klasser. 9/44 Resurshantering : Heap-allokering: new och delete Resurshantering. Objektorientering. Klasser. 10/44 ä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 Resurshantering : Heap-allokering: new och delete Resurshantering. Objektorientering. Klasser. 11/44 Resurshantering : Heap-allokering: new och delete Resurshantering. Objektorientering. Klasser. 12/44

Exempel: misslyckad read_line char * read_line () char temp [80] ; cin. getline (temp, 80); return temp ; void exempel () cout << " Ange ditt namn : "; char * namn = read_line (); cout << " Ange din bostadsort : "; char * ort = read_line (); cout << " Goddag " << namn << " från " << ort << endl ; " 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 () cout << " Ange ditt namn : "; char * namn = read_line (); cout << " Ange din bostadsort : "; char * ort = read_line (); cout << " Goddag " << namn << " från " << ort << endl ; Fungerar, men minnesläcka! Resurshantering : Heap-allokering: new och delete Resurshantering. Objektorientering. Klasser. 13/44 Resurshantering : Heap-allokering: new och delete Resurshantering. Objektorientering. Klasser. 14/44 C++: Smarta pekare 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 () cout << " Ange ditt namn : "; char * namn = read_line (); // Ta över ägarskap av sträng cout << " Ange din bostadsort : "; char * ort = read_line (); cout << " Goddag " << namn << " från " << ort << endl ; delete [] namn ; // Avallokera str ä ngarna delete [] ort ; I standardbiblioteket <memory> finns två smarta pekare: std::unique_ptr används om den är den enda ägaren till objektet std::shared_ptr används om ett objekt har flera ägare. shared_ptr innehåller en referensräknare: när sista shared_ptr till ett objekt förstörs avallokeras objektet. Jfr. garbage collection i Java. Resurshantering : Heap-allokering: new och delete Resurshantering. Objektorientering. Klasser. 15/44 Resurshantering : Smarta pekare Resurshantering. Objektorientering. Klasser. 16/44 C++: Smarta pekare Exempel void example () unique_ptr <char []> safe_c new char [80]; char * c = safe_c. get (); cin. getline (c,80); auto len = strlen (c); char last = safe_c [len -1] ; // indexering med [] fungerar cout << " last char : " << last << endl ; Genom att använda std::unique_ptr<char[]> så kommer automatiskt delete[] att göras när safe_c tas bort (i detta exempel: när funktionen returnerar). För att få en char* används unique_ptr::get(). C++: Smarta pekare Tumregler för parametrar till funktioner: om ägarskap inte ska överföras Använd råa pekare Använd std::unique_ptr<t> const & om ägarskap ska överföras. Använd värdeanropad std::unique_pointer<t> (då måste man använda std::move()) Detta är bara en orientering om att smarta pekare finns. Råa pekare är så vanliga att ni måste lära er behärska dem först. Resurshantering : Smarta pekare Resurshantering. Objektorientering. Klasser. 17/44 Resurshantering : Smarta pekare Resurshantering. Objektorientering. Klasser. 18/44

C++: Smarta pekare Grov sammanfattning Objektorienterad programutveckling Grundläggande begrepp Råa ( nakna ) pekare: Programmeraren ansvarar för allt Risk för minnesläckor Risk för dangling pointers Smarta pekare: Ingen (mindre) risk för minnesläckor (liten) Risk för dangling pointers om de används fel (t ex mer än en unique_ptr) Objekt Representation av verkligt föremål eller företeelse Egenskaper - datamedlemmar (attribut i Java) Operationer - medlemsfunktioner (metoder i Java) Klass Beskrivning av en viss typ av objekt Ett objekt sägs vara en instans av en klass Resurshantering : Smarta pekare Resurshantering. Objektorientering. Klasser. 19/44 Objektorientering, kort repetition : Grundläggande begrepp Resurshantering. Objektorientering. Klasser. 20/44 Objektorienterad programutveckling Relationer mellan objekt Objektorienterad programutveckling Objektorienterad programmering Association känner till Bil Person (ägare) Komposition har Bil Motor Generalisering är Bil Fordon class Car : public Vehicle Person * owner ; Engine e; ; Notera Till skillnad från i Java så kan ett objekt både referera till andra objekt och innehålla andra objekt. Inkapsling (encapsulation, information hiding) Samla alla egenskaper på ett ställe Gömma implementationsdetaljer Arv Återanvändning och specialisering Polymorfism samma interface till flera olika typer Virtuella funktioner: Subtyping Parametriserade programenheter: mallar (templates) Överlagring av funktioner (ad-hoc-polymorfism) Objektorientering, kort repetition : Relationer mellan objekt Resurshantering. Objektorientering. Klasser. 21/44 Objektorientering, kort repetition : Programmering Resurshantering. Objektorientering. Klasser. 22/44 Polymorfism Tidig och sen bindning Klassdefinitioner Virtuella funktioner Betydelsen bestäms först vid exekvering (dynamisk el. sen bindning (late binding)) Parametriserade programenheter (generics, mallar i C++) Enheter där vissa av de ingående typerna är parametrar. Ex.: i vector är elementen av godtycklig typ. Heltalsvektor, t ex vector<int>. Detta bestäms vid kompileringen (statisk bindning, early binding) Överlagring av funktioner Betydelsen hos en funktion bestäms av antal och typ av parametrarna. (statisk binding ) Klass Egendefinierad typ Objekt Instans av en klass (notera att objekt även kan ha en generellare betydelse i C++, enligt tidigare definition) Typisk klassdefinition: class Foo // Den utåt synliga delen // Medlemsfunktioner ( dekl.) // och ev. datamedlemmar // Den dolda delen // Datamedlemmar och // ev. medlemsfunktioner ; // Alltid semikolon efter klassdef. I C++ är struct samma som class, fast allting är public om ingen synlighet anges. Objektorientering, kort repetition : Programmering Resurshantering. Objektorientering. Klasser. 23/44 Klasser : Klassdefinitioner Resurshantering. Objektorientering. Klasser. 24/44

Klassdefinitioner Deklarationer och definitioner av medlemsfunktioner Klassdefinitioner Medlemsfunktioner och inline Medlemsfunktioner ( metoder i Java) Dekfinition av klass class Foo int fun (int, int ); // Deklaration av medlemsfunktion ; Obs! Semikolon efter klass Definition av medlemsfunktion // Definition av funktionen : int Foo :: fun (int x, int y) Inget semikolon efter funktion Inline-definition av en funktion Koden läggs ut direkt på det ställe anropet görs (inget hopp till funktionskod på annat ställe) Lämpligt endast för mycket enkla funktioner Implicit om funktionsdefinitionen skrivs direkt i klassdefinitionen Om funktionen läggs utanför klassdefinitionen (via ::-notation) används nyckelordet inline framför Klasser : Klassdefinitioner Resurshantering. Objektorientering. Klasser. 25/44 Klasser : Klassdefinitioner Resurshantering. Objektorientering. Klasser. 26/44 Klassdefinitioner Medlemsfunktioner och inline, exempel Filstruktur för klasser Inline i klassdefinitionen: class Foo int getvalue () return value ; ; Inline utanför klassdefinitionen: inline int Foo :: getvalue () return value ; Klassdefinitionen läggs i en headerfil (.h eller.hpp) För att inte riskera att definiera en klass mer än en gång används direktiv: # ifndef FOO_H # define FOO_H class Foo ; # endif // I Visual Studio finns även: # pragma once Medlemsfunktioner läggs i en källkodsfil (.cpp) Klasser : Klassdefinitioner Resurshantering. Objektorientering. Klasser. 27/44 Klasser : Klassdefinitioner Resurshantering. Objektorientering. Klasser. 28/44 Initiering av medlemsvariabler Initiering sker i en konstruktor, en speciell medlemsfunktion med samma namn som klassen (som i Java) Klasser : Resurshantering. Objektorientering. Klasser. 29/44 Två sätt att skriva initiering av medlemmar Med initierarlista i konstruktorn. class Bar int value ; bool flag ; Bar(int v, bool b) : value v, flag b ; Medlemmar kan ha en default initializer, i C++11: class Foo Foo () Foo(int v) : value v int value 0; // C ++11 ; Om en medlem både har default initializer och initierare i konstruktorn finns, används initieraren i konstruktorn. Klasser : Resurshantering. Objektorientering. Klasser. 30/44

Defaultkonstruktor Definieras automatiskt om det inte finns någon konstruktor alls definierad (explicit: =default, kan ej anropas om =delete) Svarar mot en konstruktor utan parametrar Får ha parametrar med defaultvärden Defaultkonstruktor med initierarlista. class Bar Bar ( int v=100, bool b= false ) : value v, flag b int value ; bool flag ; ; Defaultkonstruktor och parenteser Bar b1; Bar b2 ; Bar be (); // kompileringsfel! " most vexing parse " Bar b3 (25); // OK Bar* bp1 = new Bar; Bar* bp2 = new Bar ; Bar* bp3 = new Bar (); // OK Anrop av defaultkonstruktor kan inte göras med tomma parenteser. Klasser : Resurshantering. Objektorientering. Klasser. 31/44 Klasser : Resurshantering. Objektorientering. Klasser. 32/44 Initiering och tilldelning Man kan skriva som i Java, men det är inte lika effektivt. Som i Java: tilldelning i konstruktor class Foo Foo (int v) value = v; // OBS! tilldelning, inte initiering int value ; // initieras innan konstruktorns kropp exekveras ; Kopieringskonstruktor Anropas vid t.ex. initiering av ett objekt då detta ska bli en kopia av ett annat objekt av samma typ Anropas inte vid tilldelning Kan definieras, men i annat fall definieras automatiskt en standardvariant av kopieringskonstruktor (=default, =delete) Bar b1 (10, false ; Bar b2b1 ; // kopieringskonstruktorn anropas Bar b3(b2 ); // kopieringskonstruktorn anropas Bar b4 = b2; // kopieringskonstruktorn anropas b4 = b3; // kopieringskonstruktorn anropas inte Klasser : Resurshantering. Objektorientering. Klasser. 33/44 Klasser : Resurshantering. Objektorientering. Klasser. 34/44 Typomvandlingskonstruktor och explicit Kopieringskonstruktor Har en const & som parameter: Bar::Bar(const Bar& b); Typomvandlingskonstruktor Anropas då konstruktorn anropas med uttryck av annan typ struct A A( int ) ; struct B explicit B( int ) ; class KomplextTal KomplextTal (): re (1), im (0) // Default KomplextTal (float x):re(x),im (0) // Typomv. KomplextTal ( const KomplextTal & k) :rek.re,imk.im float re, im; ; A a1 (2); A a2 = 1; A a3 = (A)1; // OK // OK // OK B b1 (2); // OK B b2 = 1; // Fel! [1] B b3 = (B)1; // OK: explicit cast [1]: conversion from int to non - scalar type B requested explicit gör att en konstruktor inte kan anropas implicit för typomvanding. Klasser : Resurshantering. Objektorientering. Klasser. 35/44 Klasser : Resurshantering. Objektorientering. Klasser. 36/44

Delegering (C++11) Destruktorer I C++11 kan en konstruktor anropa en annan (som this(...) i Java). struct Test int val ; bool bar ; Test (int v, bool b) : val v, bar b När minnesutrymme allokeras dynamiskt inne i en konstruktor (med new) måste detta avallokeras igen så småningom. Det finns en motsats till konstruktor som anropas vid avallokering (t.ex. vid delete). Denna kallas destruktor (namnet inleds med komplementoperatorn ~ ( tilde ) ; Test (int v) : Test (v, true ) ; // delegering Test () : Test (0, false ) ; // delegering class Foo ~Foo (); // Dekl. av ; destruktor Klasser : Resurshantering. Objektorientering. Klasser. 37/44 Klasser : Detruktorer Resurshantering. Objektorientering. Klasser. 38/44 Exempel: Vektor Exempel: Vektor Klassdefinition class Vektor Vektor ( int lng = 10); // Ä ven defaultkonstruktor Vektor ( const Vektor & v); // Kopiering! ~ Vektor (); // Destruktor int lngd () return ant ; // Inline! int get_elem ( int ind ); void set_elem ( int ind, int val ); int *p; // Själva vektorn int ant ;// Antalet element ; Vektor :: Vektor (int lng) : ant(lng) assert (ant >=0); // Indexkontroll ( unsigned vore bättre ) p = new int [ant ]; // Dynamisk allokering // Kopieringskonstruktor Vektor :: Vektor (const Vektor & v) : ant(v.ant) p = new int [ant ]; for (int i=0; i<ant; i++) p[i] = v.p[i]; Klasser : Detruktorer Resurshantering. Objektorientering. Klasser. 39/44 Klasser : Detruktorer Resurshantering. Objektorientering. Klasser. 40/44 Exempel: Vektor Exempel: Vektor Övriga medlemsfunktioner int Vektor :: get_elem (int ind ) assert (ind >=0 && ind <ant ); return p[ ind ]; void Vektor :: set_elem (int ind, int val) assert (ind >=0 && ind <ant ); p[ ind ] = val ; Destruktorn // Deallokera allt dynamiskt minnesutrymme Vektor ::~ Vektor () delete [] p; Destruktorn kan även skrivas inne i klassdefinitionen: ~ Vektor () delete [] p; Klasser : Detruktorer Resurshantering. Objektorientering. Klasser. 41/44 Klasser : Detruktorer Resurshantering. Objektorientering. Klasser. 42/44

Exempel: Vektor Resurshantering Sammanfattning Vi har talat om Exempel: objekt på stack och heap i ett block Vektor v; // Konstruktor anropas (stack - allokering ) Vektor *pv; pv = new Vektor ; // Konstruktoranrop (heap - allokering ) delete pv; // Destruktor anropas för objektet som pv pekar på // Destruktor anropas för v Resurshantering (minnesallokering, minnesläckor, dangling pointers) Klasser Nästa föreläsning: Vi kommer att introducera const för objekt och medlemmar Statiska medlemmar Pekaren this Vänner (friend) Överlagring av operatorer Klasser : Detruktorer Resurshantering. Objektorientering. Klasser. 43/44 Klasser : Detruktorer Resurshantering. Objektorientering. Klasser. 44/44