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

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

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 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

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

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

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

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

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

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

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

Dynamisk bindning och polymorfism

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

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

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

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)

Introduktion till arv

TDDC76 - Programmering och Datastrukturer

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

TDIU01 Programmering i C++

Programsystemkonstruktion med C++

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

Kopiering av objekt i Java

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

TDDC76 Programmering och datastrukturer

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

TDIU01 - Programmering i C++, grundkurs

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Classes och Interfaces, Objects och References, Initialization

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

TDDC76 - Programmering och Datastrukturer

DAT043 - Föreläsning 7

Tillämpad programmering

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

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

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

5 Arv och dynamisk bindning FIGUR

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

Java, klasser, objekt (Skansholm: Kapitel 2)

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

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

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

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

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

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

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

Arv. Objektorienterad och komponentbaserad programmering

Arv bakgrund (kap. 9)

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

Tentamen *:85/2I4123 C

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Skapa, kopiera och destruera klassobjekt

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

allokeras på stacken dynamiskt new delete

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Klasshierarkier - repetition

Det finns många flaggor till g++,

Polymorfi. Objektorienterad och komponentbaserad programmering

Initiering och tilldelning

Innehåll. Pekare Syntax

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

Föreläsning 2, vecka 8: Repetition

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

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

DAT043 - föreläsning 8

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Tentamen EDAF30 Programmering i C++

Föreläsning 5-6 Innehåll

Den som bara har en hammare tror att alla problem är spikar

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Programmering B med Visual C

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

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

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

TDIU01 - Programmering i C++, grundkurs

Tillämpad programmering

Övningar Dag 2 En första klass

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

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

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

Föreläsning 5-7 Operatoröverlagring

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

TDDC76 - Programmering och Datastrukturer

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Transkript:

Innehåll EDAF30 Programmering i C++ 8. Klasser; resurshantering och polymorfism Sven Gestegård Robertz Datavetenskap, LTH 2016 1 Klasser 2 Operatorer 3 Klasser, resurshantering Rule of three Move semantics (C++11) 4 Polymorfism och arv Virtuella funktioner 8. Klasser; resurshantering och polymorfism 2/1 Klasser Resurshantering, representation struct Vector Vector ( int s) :szs, elem new double (sz ) ~ Vector () delete [] elem ; double & operator []( int i) return elem [i]; int sz; double * elem ; ; void test () Vector vec (5); vec [2] = 7; Vector vec: sz: 5 elem Resource handle Vector äger sin double[] objektet: pekare + storlek, arrayen ligger på heapen 7 Pekaren this Självreferens I en medlemsfunktion finns den implicita pekaren this, som pekar på objektet som funktionen anropades för. (jfr. this i Java). Exempel på användning struct Clock Clock (); Clock & set(int h, int m, int s); Clock & tick (); Clock & print (); int seconds ; ; Clock & Clock :: tick () ++ seconds ; Implicit deklarerad Clock* const this Om vi har en variabel Clock c; kan vi nu kedja anrop: c.set(12,15,0).tick().tick().print(); Klasser 8. Klasser; resurshantering och polymorfism 3/34 Klasser 8. Klasser; resurshantering och polymorfism 4/34 Kan göras för de flesta operatorer, utom sizeof..* ::?: T ex kan dessa operatorer överlagras = + - * / % ^ & ~ << >> &&!!= == < > ++ -- += *=... () [] -> ->* & new delete new [] delete [] görs med syntaxen returtyp operator (parametrar...) för någon operator t.ex. == eller + Kan, för klasser, göras på två sätt: som medlemsfunktion om ordningen på operanderna är lämplig som fri funktion om det publika gränssnittet räcker, eller om funktionen deklareras friend Operatorer 8. Klasser; resurshantering och polymorfism 5/34 Operatorer 8. Klasser; resurshantering och polymorfism 6/34

som medlemsfunktioner och fria funktioner Exempel: deklaration som medlemsfunktioner class Komplex Komplex ( float r, float i) : re(r), im(i) Komplex operator +( const Komplex & rhs ) const ; Komplex operator *( const Komplex & rhs ) const ; //... float re, im; ; Exempel: deklaration operator+ som friend Deklaration inuti klassdefinitionen för Komplex: friend Komplex operator +( const Komplex & l, const Komplex & r); Överlagrade operatorer i användning: Exempel: Komplexa tal Komplex a = Komplex (1.2, 3.4); Komplex b = Komplex (2.3, 1); Komplex c = b; a = b + c; // a = b. operator +(c); b = b + c * a; c = a * b + Komplex (7, 4.5); Notera antalet parametrar Operatorer 8. Klasser; resurshantering och polymorfism 7/34 Operatorer 8. Klasser; resurshantering och polymorfism 8/34 Definition av operatorn + på två sätt Som medlemsfunktion Komplex Komplex :: operator +( const Komplex & rhs )const temp.re = re + rhs.re; temp.im = im + rhs.im; Som fri funktion Komplex operator +( const Komplex & l, const Komplex & r) temp.re = l.re + r.re; temp.im = l.im + r.im; Att denna är friend syns bara i friend-deklarationen i klassen Definition av operatorn + på två sätt Som medlemsfunktion Komplex Komplex :: operator +( const Komplex & rhs)const temp.re = re + rhs.re; temp.im = im + rhs.im; Som fri funktion så att högra operanden inte kan ändras så att vänstra operanden inte kan ändras Komplex operator +( const Komplex & l, const Komplex & r) temp.re = l.re + r.re; temp.im = l.im + r.im; Att denna är friend syns bara i friend-deklarationen i klassen Operatorer 8. Klasser; resurshantering och polymorfism 9/34 Operatorer 8. Klasser; resurshantering och polymorfism 9/34 Annan variant av + som använder += Klassdefinition class Komplex const Komplex & operator +=( const Komplex & z) re += z.re; im += z.im; //... ; Returnerar const-referens för att inte tillåta t.ex. (a += b) = c; Fri funktion, behöver inte vara friend Komplex operator +( Komplex a, Komplex b) return a+=b; Binära operatorer: Variant av + med heltal som höger operand Deklarationen (i klassdefinitionen av Komplex) Komplex Komplex :: operator +( int d) const ; Definitionen (utanför klassdefinitionen) Komplex Komplex :: operator +( int d) const Komplex temp (* this ); temp.re += d; NB! värdeanrop: vi vill returnera en kopia. Operatorer 8. Klasser; resurshantering och polymorfism 10/34 Operatorer 8. Klasser; resurshantering och polymorfism 11/34

Exempel: << Binära operatorer: Variant av + med heltal som vänster operand Problem: Kan inte använda medlemsfunktion! (varför?) Deklarationen (Obs! Utanför klassdefinitionen) Komplex operator + (int d, const Komplex & v); Definitionen (Obs! Ingen medlemsfunktion!) Komplex operator + (int d, const Komplex & v) return v + d; // Utnyttjar andra +-op.! Exempel på friend-deklarerad operator: << (#include <ostream>) Deklarationen (i klassdefinitionen) friend ostream & operator <<( ostream & o, const Komplex & v); Definitionen (Obs! Ingen medlemsfunktion) ostream & operator <<( ostream & o, const Komplex & v) o << v.re << + << v.im << i ; return o; Behöver inte vara friend: använder bara det publika gränssnittet. Operatorer 8. Klasser; resurshantering och polymorfism 12/34 Operatorer 8. Klasser; resurshantering och polymorfism 13/34 Unära operatorer: Ökningsoperatorerna ++ Deklarationen (i klassdefinitionen) const Komplex & operator ++ (); // preinkrement (++ v) Komplex operator ++ (int ); // postinkrement (v ++) Dummy-parameter för att markera postinkrement-varianten Definitionen (utanför klassdefinitionen) const Komplex & Komplex :: operator ++ () // prefix return (* this ) += 1; // Returnera inkrementerad Komplex Komplex :: operator ++ (int ) // postfix Komplex temp (* this ); // Kopia av detta objekt (* this ) += 1; // Returnera oinkrementerad kopia Typomvandlings-operatorer Exempel: Counter Konvertering till int struct Counter Counter (int c=0) :cntc ; Counter & inc () ++ cnt; Counter inc () const return Counter ( cnt +1); int get () const return cnt ; operator int () const return cnt ; int cnt 0; ; Notera: operator T(). returtyp anges inte kan deklareras explicit Operatorer 8. Klasser; resurshantering och polymorfism 14/34 Operatorer 8. Klasser; resurshantering och polymorfism 15/34 Tilldelningsoperatorn: operator= (copy assignment ) Rule of three Canonical construction idiom Deklarationen (i klassdefinitionen av Vektor) const Vektor & operator =( const Vektor & v); Definitionen (utanför klassdefinitionen) const Vektor & Vektor :: operator =(const Vektor & v) if ( this!= &v) delete [] elem ; sz = v.sz; elemp = new int[sz ]; for (int i =0; i<sz; i ++) elem [i] = v. elem [i]; 1 kolla self assignment 2 Frigör gamla resurser 3 Allokera nya resurser 4 Kopiera värden För felhantering bättre att allokera och kopiera först och bara göra delete om allokeringen lyckades. Operatorer 8. Klasser; resurshantering och polymorfism 16/34 Om en klass äger någon resurs, ska den ha en egen 1 Destruktor 2 Copy constructor 3 Copy assignment operator för att inte läcka minne. T ex. klassen Vektor Regel: Om du definerar någon, ska du definiera alla. Klasser, resurshantering : Rule of three 8. Klasser; resurshantering och polymorfism 17/34

Varnande exempel Default-kopiering Rule of three five Canonical construction idiom, fr o m C++11 För klasser som äger resurser fungerar inte default-kopiering. värdeanrop kopiering destruktorn körs vid return dangling pointer Exempel: Vector Om en klass äger någon resurs, ska den ha en egen 1 Destruktor 2 Copy constructor 3 Copy assignment operator 4 Move constructor 5 Move assignment operator Klasser, resurshantering : Rule of three 8. Klasser; resurshantering och polymorfism 18/34 Klasser, resurshantering : Rule of three 8. Klasser; resurshantering och polymorfism 19/34 Move semantics Move semantics (C++11) Exempel: Vektor Copy-konstruktor Onödigt att kopiera om man vet att källan ska förstöras direkt Bättre att stjäla innehållet Gör resource handles ännu effektivare Vissa objekt får/kan inte kopieras std::move gör om till en rvalue-referens (T&&) Vector :: Vector (const Vector & v) :elem new double [v.sz ], szv.sz for (int i=0; i < sz; ++i) elem [i] = v[i]; Move-konstruktor Vector :: Vector ( Vector && v) : elem v.elem, szv.sz v. elem = nullptr ; v.sz = 0; // v har inga element Klasser, resurshantering : Move semantics (C++11) 8. Klasser; resurshantering och polymorfism 20/34 Klasser, resurshantering : Move semantics (C++11) 8. Klasser; resurshantering och polymorfism 21/34 Move semantics (C++11) Exempel: Vektor Polymorfism och dynamisk bindning Copy-assignment Vector & Vector :: operator =( const Vector & v) if( this!= &v) double * tmp = new double [v.sz ]; for (int i = 0; i < v.sz; ++i) tmp [i] = v[i]; delete [] elem ; elem = tmp ; sz = v.sz; Polymorfism (mångformighet) Överlagring Generiska programenheter (templates) Virtuella funktioner Statisk bindning Statisk bindning Dynamisk bindning Move-assignment Vector & Vector :: operator =( Vector && v) if( this!= &v) elem = v. elem ; // " flytta " arrayen från v v. elem = nullptr ; // markera att v är ett " tomt skrov " sz = v.sz; v.sz = 0; Statisk bindning: Dynamisk bindning: Betydelsen hos en viss konstruktion avgörs vid kompilering Betydelsen hos en viss konstruktion avgörs vid exekvering Klasser, resurshantering : Move semantics (C++11) 8. Klasser; resurshantering och polymorfism 22/34 Polymorfism och arv 8. Klasser; resurshantering och polymorfism 23/34

Arv. Generalisering och specialisering Generalisering: abstrahera gränssnitt Specialisering: återanvändning och utökning Relationen är: En bil är ett fordon Polymorfism och arv 8. Klasser; resurshantering och polymorfism 24/34 Konkreta typer uppför sig precis som inbyggda typer : Representationen ingår i definitionen 1 Kan placeras på stacken, och i andra objekt Kan refereras till direkt (och inte bara genom pekare eller referenser) Kod som använder den måste kompileras om om typen ändras Abstrakta typer isolerar användaren från implementationsdetaljer och skiljer gränssnittet från representationen: Representationen av objekt (inkl. storleken!) är okänd Kan bara refereras via pekare eller referenser Måste allokeras på heapen 2 1 kan vara privat, men är känd 2 Egentligen: objekt av en abstrakt typ kan inte skapas, men objekt på stacken blir inte polymorfa Polymorfism och arv : 8. Klasser; resurshantering och polymorfism 25/34 En konkret typ: Vektor class Vektor Vektor ( int l = 10) :p new int [l],szl ~ Vektor () delete [] elem ; int size () const return sz ; int & operator []( int i) assert (i<sz ); return elem [i ]; int * elem ; int sz; ; Generalisering: extract interface class Container int size () const ; int & operator []( int o); ; Generalisering: en abstrakt typ, Container class Container virtual int size () const =0; virtual int & operator []( int o) =0; virtual ~ Container () ; pure virtual funktion Abstrakt klass eller interface i Java class Vektor : public Container Vektor ( int l = 10) :p new int [l],szl ~ Vektor () delete [] elem ; int size () const override return sz ; int & operator []( int i) override assert (i<sz ); return elem [i]; int * elem ; int sz; ; extends (eller implements) Container i Java override motsvarar @Override i Java (C++11) En polymorf typ måste ha en virtuell destruktor Polymorfism och arv : 8. Klasser; resurshantering och polymorfism 26/34 Polymorfism och arv : Virtuella funktioner 8. Klasser; resurshantering och polymorfism 27/34 Användning av abstrakta klassen void fill ( Container & c, int v) for (int i =0; i!=c. size (); ++i) c[i] = v; void print ( Container & c) for (int i =0; i!=c. size (); ++i) cout << c[i] << " " ; cout << endl ; void test_container () Vektor v (10) ; fill (v,3); Polymorfism och arv : Virtuella funktioner 8. Klasser; resurshantering och polymorfism 28/34 Användning av abstrakta klassen Anta nu att vi har två andra subklasser till Container class MyArray : public Container...; class List : public Container...; void test_container () Vektor v (10); fill (v); MyArray a (5); fill (a); print (a); List l1,2,3,4,5,6,7; print (l); Dynamisk bindning av Container::size() och Container::operator[]() Polymorfism och arv : Virtuella funktioner 8. Klasser; resurshantering och polymorfism 29/34

Variant, utan att ändra Vektor Om vi inte kan (eller vill) ändra klassen Vektor kan vi använda den för att skapa en ny klass: class Vektor_container : public Container Vektor_container ( int l = 10) :vl ~ Vektor_container () int size () const override return v.size (); int & operator []( int i) override return v[i]; Vektor v; ; Vektor är en konkret klass Notera att v är ett Vektor-objekt, inte en referens Skillnad från Java Vektors destruktor (för v) anropas implicit Dynamisk bindning virtuell funktions-tabell(vtbl) innehåller pekare till objektets virtuella funktioner varje klass med någon virtuell medlemsfunktion har en vtbl varje objekt har en pekare till klassens vtbl anrop av en virtuell funktion (typiskt) < 25% dyrare Vektor_container: v.sz v.p List:... vtbl: vtbl: Vektor_container::size() Vektor_container::operator[]() Vektor_container:: Vektor_container List::size() List::operator[]() List:: List Polymorfism och arv : Virtuella funktioner 8. Klasser; resurshantering och polymorfism 30/34 Polymorfism och arv : Virtuella funktioner 8. Klasser; resurshantering och polymorfism 31/34 Nästa föreläsning Läsanvisningar Dynamisk poymorfism och arv kapitel 15 15.4 Typomvandling och arv kapitel 15.2.3 Arv och resurshantering 15.7 Klassmallar 16.1.2 Referenser till relaterade avsnitt i Lippman Klasser, resurshantering 13.1, 13.2 Move semantics 13.6 Operatorer och typomvandling kapitel 14 Dynamisk poymorfism och arv kapitel 15 15.2.2 Pekaren this s. 257 260 Polymorfism och arv : Virtuella funktioner 8. Klasser; resurshantering och polymorfism 32/34 Polymorfism och arv : Virtuella funktioner 8. Klasser; resurshantering och polymorfism 33/34