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

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

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

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. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

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. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

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

Innehåll. Pekare Syntax

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

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

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

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

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

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

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

Dynamisk bindning och polymorfism

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

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

Introduktion till arv

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

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

TDIU01 - Programmering i C++, grundkurs

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

TDDC76 - Programmering och Datastrukturer

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

TDDC76 Programmering och datastrukturer

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

DAT043 - Föreläsning 7

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

Programsystemkonstruktion med C++

Tillämpad programmering

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

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

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

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Parameteröverföring. Exempel. Exempel. Metodkropp

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

TDIU01 Programmering i C++

Classes och Interfaces, Objects och References, Initialization

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

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

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

5 Arv och dynamisk bindning FIGUR

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

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

DAT043 - föreläsning 8

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

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

Kopiering av objekt i Java

TDIU01 - Programmering i C++, grundkurs

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

Föreläsning 2, vecka 8: Repetition

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Generiska konstruktioner. Kursbokens kapitel 13

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

Programmering A. Johan Eliasson

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

TDDC76 - Programmering och Datastrukturer

F8: Typkonvertering i C++

allokeras på stacken dynamiskt new delete

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

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

Objektorienterad programmering Föreläsning 4

Arrayer. results

TDDC77 Objektorienterad Programmering

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Kapitel 6 - Undantag

(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

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Arv. Objektorienterad och komponentbaserad programmering

Repetition C-programmering

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

Tentamen EDAF30 Programmering i C++

C++ - En introduktion

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

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

Programmering B med Visual C

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

Arv bakgrund (kap. 9)

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

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

Transkript:

Innehåll EDAF30 Programmering i C++ 8. Typomvandlingar. Klasser: operatorer och polymorfism. 1 Typomvandlingar Sven Gestegård Robertz Datavetenskap, LTH 2017 2 Klasser Operatorer 3 Polymorfism och arv Virtuella funktioner 8. Typomvandlingar. Klasser: operatorer och polymorfism. 2/1 Implicita Typomvandlingar Automatiska typomvandlingar Uttryck av typen x y, för någon binär operator E 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) Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11) 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 Typomvandlingar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 3/34 Typomvandlingar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 4/34 Explicita typomvandlingar, C-stil Varnande exempel Syntax i C och i C++, som i Java (typnamn)uttryck, t ex (float) 10 Stor risk att göra fel - använd namgivna typomvandligar blir tydligare i koden, t ex const_cast kan bara ändra const lätt att söka efter: casts är bland det första man tittar på när man letar fel Varning i GCC: -Wold-style-casts Vanlig i äldre kod Alternativ syntax i C++ struct Point int x; int y; ; struct Point3d : public Point int z; ; Point: Point3d: z: typnamn ( uttryck ) typnamn måste vara ett ord, d v s int *(...) eller unsigned long(...) är inte OK. Typomvandlingar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 5/34 Typomvandlingar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 6/34

Datatyper och variabler Varnande exempel Några begrepp: en typ definierar mängden möjliga värden och operationer (för ett objekt) ett objekt är ett stycke minne som innehåller ett värde ett värde är en följd bitar som ska tolkas enligt en viss typ. struct Point int x; int y; ; Point ps [3]; struct Point3d int x; int y; int z; ; Point3d * foo = ( Point3d *) ps; ps: z: x z: ps[0] ps[1] ps[2] foo[0] foo[1] Med named casts måste man använda reinterpret_cast<point3d*> med static_cast fås felet invalid static_cast from type Point[3] to type Point3d* Typomvandlingar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 7/34 Typomvandlingar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 8/34 specialfall: void-pekare En void* kan peka på vad som helst (objekt av godtycklig typ.) I C omvandlas void* implicit till/från varje pekartyp. I C++ omvandlas T* implicit till void*. Åt andra hållet krävs en explicit type cast. Kan göras för de flesta operatorer, utom sizeof..* ::?: T ex kan dessa operatorer överlagras = + - * / % ^ & ~ << >> &&!!= == < > ++ -- += *=... () [] -> ->* & new delete new [] delete [] Typomvandlingar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 9/34 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 10/34 som medlemsfunktioner och fria funktioner 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 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 Komple friend Komplex operator +( const Komplex & l, const Komplex & r); Notera antalet parametrar Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 11/34 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 12/34

Ö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); 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 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 13/34 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 14/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 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 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 14/34 Annan variant av + som använder += Klassdefinition class Komplex const Komplex & operator +=( const Komplex & z) re += z.re; im += z.im; return * this ; //... ; 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; NB! värdeanrop: vi vill returnera en kopia. Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 15/34 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; 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.! Behöver inte vara friend: använder bara det publika gränssnittet. Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 16/34 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 17/34

Exempel: << 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; 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 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 18/34 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 19/34 Typomvandlings-operatorer Exempel: Counter Konvertering till int struct Counter Counter (int c =0) : cnt c ; Counter & inc () ++ cnt ; return * this ; 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 Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 20/34 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 ; return * this ; 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(); Tilldelningsoperatorn: operator= (copy assignment ) 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) auto tmp = new int[sz ]; for (int i=0; i<sz; i++) tmp[i] = v. elem [i]; sz = v.sz; delete [] elem ; elem = tmp; return * this ; 1 kolla self assignment 2 Allokera nya resurser 3 Kopiera värden 4 Frigör gamla resurser För felhantering bättre att allokera och kopiera först och bara göra delete om allokeringen lyckades. Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 21/34 Polymorfism och dynamisk bindning Polymorfism (mångformighet) Överlagring Generiska programenheter (templates) Virtuella funktioner Statisk bindning: Dynamisk bindning: Statisk bindning Statisk bindning Dynamisk bindning Betydelsen hos en viss konstruktion avgörs vid kompilering Betydelsen hos en viss konstruktion avgörs vid exekvering Klasser : Operatorer 8. Typomvandlingar. Klasser: operatorer och polymorfism. 22/34 Polymorfism och arv 8. Typomvandlingar. Klasser: operatorer 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 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) Kan kopieras 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 Kan inte instansieras endast konkreta subklasser 1 kan vara privat, men är känd Polymorfism och arv 8. Typomvandlingar. Klasser: operatorer och polymorfism. 24/34 Polymorfism och arv : 8. Typomvandlingar. Klasser: operatorer 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. Typomvandlingar. Klasser: operatorer och polymorfism. 26/34 Polymorfism och arv : Virtuella funktioner 8. Typomvandlingar. Klasser: operatorer 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. Typomvandlingar. Klasser: operatorer 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. Typomvandlingar. Klasser: operatorer 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 () = default ; 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. Typomvandlingar. Klasser: operatorer och polymorfism. 30/34 Polymorfism och arv : Virtuella funktioner 8. Typomvandlingar. Klasser: operatorer och polymorfism. 31/34 Nästa föreläsning Läsanvisningar Dynamisk poymorfism och arv kapitel 15 15.4 Tillgänglighet och scope kapitel 15.5 15.6 Typomvandling och arv kapitel 15.2.3 Arv och resurshantering 15.7 Polymorfa typer och containers 15.8 Multipelt arv 18.3 Virtuella basklasser 18.3.4 18.3.5 Referenser till relaterade avsnitt i Lippman Typomvandingar 4.11 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. Typomvandlingar. Klasser: operatorer och polymorfism. 33/34 Polymorfism och arv : Virtuella funktioner 8. Typomvandlingar. Klasser: operatorer och polymorfism. 34/34 Funktionspekare Funktionspekare Pekare kan också peka på funktioner double hypotenuse ( int a, int b) return sqrt ( a*a + b*b); double add (int x, int y) return x+y; int main () double (* pf )( int, int ); pf = hypotenuse ; cout << " hypotenuse : " << pf (3,4) << endl ; pf = add ; cout << " add : " << pf (3,4) << endl ; Funktionspekare kan vara argument till funktioner double eval ( double (*f)( int,int ), int m, int n) return f(m, n); double hypotenuse ( int a, int b) return sqrt (a*a + b*b); double add(int x, int y) return x + y; int main () cout << eval ( hypotenuse, 3, 4) << endl ; cout << eval (add, 3, 4) << endl ; Funktionspekare 8. Typomvandlingar. Klasser: operatorer och polymorfism. 35/34 Funktionspekare 8. Typomvandlingar. Klasser: operatorer och polymorfism. 36/34

Funktionspekare Alternativ i C++ Pekare och textsträngar C-strängar Lagring i minnet null-terminerad: tecknet \0 markerar slutet på strängen Funktionspekare finns i C. I C++ finns även funktor: klass med operator() lambda: anonym funktor char namn []= " Nils "; // längd = 5 bytes är ekvivalent med char namn [] = N, i, l, s, \0 ; adress data namn N namn+1 i namn+2 l namn+3 s namn+4 \0 Access av element cout << namn [1] << namn [3]; is Funktionspekare 8. Typomvandlingar. Klasser: operatorer och polymorfism. 37/34 C-strängar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 38/34 Pekare och textsträngar C-strängar Notera returtyperna char namn [] = " Nisse "; char * p; p = namn ; cout << p << endl ; cout << p+3 << endl ; // Skriver en delstr äng ( typ : char *) cout << *(p+3) << endl ; // Skriver ett tecken ( typ : char ) cout << namn + 3 << endl ; // Samma som p+3 cout << namn [3] << endl ; // ett tecken Nisse se s se s C-strängar 8. Typomvandlingar. Klasser: operatorer och polymorfism. 39/34