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

Relevanta dokument
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. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

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

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

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

Innehåll. Pekare Syntax

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

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

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. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

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

Innehåll. Pekare Exempel

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

Innehåll. Pekare Exempel

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

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

TDIU01 - Programmering i C++, grundkurs

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

Generiska konstruktioner. Kursbokens kapitel 13

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

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

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

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

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

Tillämpad programmering

TDIU01 - Programmering i C++, grundkurs

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Innehåll. Datatyper Pekare, Arrayer och Referenser. Pekare. Pekare Syntax. Pekare Syntax, operatorerna * och & 5. Pekare och arrayer. Algoritmer.

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

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

TDDC76 - Programmering och Datastrukturer

Tommy Färnqvist, IDA, Linköpings universitet

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

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

Arrayer. results

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

Tentamen EDAF30 Programmering i C++

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

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

2D1387, Programsystemkonstruktion med C++ 01/02 1

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

TDIU01 - Programmering i C++, grundkurs

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

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

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

Parameteröverföring. Exempel. Exempel. Metodkropp

C++ - En introduktion

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

Tentamen EDAF30 Programmering i C++

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

Classes och Interfaces, Objects och References, Initialization

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

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

Klassdeklaration. Metoddeklaration. Parameteröverföring

TDDC76 - Programmering och Datastrukturer

Inlämningsuppgift, EDAF30, 2016

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Inlämningsuppgift, EDAF30, 2018

Objektorienterad Programmering (TDDC77)

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

Typkonvertering. Java versus C

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

Repetition C-programmering

Objektorienterad Programmering (TDDC77)

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

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Introduktion till arv

Introduktion C-programmering

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

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Programmering A. Johan Eliasson

F4. programmeringsteknik och Matlab

Intro till standardbiblioteket. Eric Elfving

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

TDDC76 Programmering och datastrukturer

TDDC76 - Programmering och Datastrukturer

Det finns många flaggor till g++,

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

F8: Typkonvertering i C++

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Sammansatta datatyper Generics: Parametrisk polymorfism

Föreläsning 3-4 Innehåll

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

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

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Algoritmbiblioteket (STL) Designstrategi Generiska algoritmer som fungerar på godtyckliga samlingsdatatyper, vilka har iteratorer.

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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

Transkript:

Innehåll EDAF30 Programmering i C++ 6. Typer, pekare och konstanter. 1 Sven Gestegård Robertz Datavetenskap, LTH 2016 2 Pekare och konstanter Operatorn -> Konstanter 3 Typomvandlingar 6. Typer, pekare och konstanter. 2/1 Generisk programmering Templates (mallar) Använder typparametrar för att skriva mer generella klasser och funktioner Slipper manuellt skriva en ny klass/funtion för varje datatyp som ska hanteras statisk polymorfism En mall instansieras av kompilatorn för typer den används för varje instans är en separat klass/funktion vid kompilering: ingen kostnad vid exekvering Exempel: Vanliga minimifunktionen template < class T> const T& minimum ( const T& a, const T& b) if (a < b) return a; else return b; Kan instansieras för alla typer som har operatorn < 6. Typer, pekare och konstanter. 3/32 6. Typer, pekare och konstanter. 4/32 Överlagring med vanlig funktion Instansiering av funktionsmallar sker i vissa fall automatiskt t.ex. vid utskrift: double x = 7.0, y = 5.0; long m = 5, n = 7; //... cout << minimum (x, y) << endl ; cout << minimum (m, n) << endl ; // Blandat funkar inte ( ingen casting görs!) cout << minimum (m, y) << endl ; // För att forcera casting ger man typ - parametern explicit cout << minimum <double >(m, y) << endl ; En explicit instans av en funktionsmall är en vanlig funktion implicit typkonvertering av argument struct Name string s; //... ; Överlagring för Name& const Name & minimum ( const Name & a, const Name & b) if(a.s < b.s) return a; else return b; 6. Typer, pekare och konstanter. 5/32 6. Typer, pekare och konstanter. 6/32

Funktionsmall för minsta elementet i en array kan överlagras template < typename T> T& min_element (T a[], size_t n) cout << "[min_element <"<<typeid (T). name ()<<"[] >]\n"; size_t idx = 0; for ( size_t i = 1; i < n; ++i) if(a[i] < a[ idx ]) idx = i; return a[ idx ]; (kompilatorn härleder typparametern T) int a[] 3,5,7,6,8,5,2,4; Generalisering: överlagra min_element för fler datastrukturer int ma = min_element (a, sizeof (a)/ sizeof (int )); 6. Typer, pekare och konstanter. 7/32 6. Typer, pekare och konstanter. 8/32 Funktionsmall för minsta elementet i iterator-par Funktionsmall för minsta elementet i en vector<t> template <typename FwdIterator > ForwardIterator min_element ( FwdIterator start, FwdIterator end) if( start == end ) return end ; ForwardIterator res = start ; auto it = start ; while (++ it!= end ) if (* it < * res ) res = it; return res ; Standardalgoritmerna är templates int a[] 3,5,7,6,8,5,2,4; int ma2 = * min_element (begin (a), end (a )); int ma3 = * min_element (a+2,a +4); Detta är en version av std::min_element Parametriserad på element-typen för vector template < typename T> T& min_element (vector <T>& c) if(v. begin ()==v.end ()) throw std :: range_error ("empty vector "); return * min_element (v.begin (), v.end ()); vector <int > v3,5,7,6,8,5,2,4; int mv2 = min_element (v); vector <int > v3,5,7,6,8,5,2,4; int mv = * min_element (v.begin (), v.end ()); 6. Typer, pekare och konstanter. 9/32 6. Typer, pekare och konstanter. 10/32 Funktionsmall för minsta elementet i en container Variant som kan användas för en godtycklig klass som har begin() och end() har en typedef som definierar namnet value_type (detta uppfylls av alla standard-containers) template <class Container > typename Container :: value_type & min_element ( Container & c) if(c. begin ()==c. end ()) throw std :: range_error ("empty container "); return * min_element (c.begin (), c.end ()); Kan även deklareras med två typ-parametrar: template <typename Container, typename T = typename Container :: value_type > T& min_element ( Container & c) Funktionsmall för minsta elementet i en array Trick: värdeparameter för arrayens storlek, och inferens template < typename T, size_t N> T& min_element (T (&a)[n]) size_t idx = 0; for ( size_t i = 1; i < N; ++i) if(a[i] < a[idx ]) idx = i; return a[idx ]; int a[] 3,5,7,6,8,5,2,4; int ma4 = min_element (a); Här vet kompilatorn storleken på a[] och fyller i mall-parametern N 6. Typer, pekare och konstanter. 11/32 6. Typer, pekare och konstanter. 12/32

minsta elementet i nånting man kan iterera över int a[] 3,5,7,6,8,5,2,4; int & ma = min_element (a); vector <int > v3,5,7,6,8,5,2,4; int & mv = min_element (v); deque <int > dv. begin (), v. end (); int & md = min_element (d); string s" kontrabasfiol "; char & ms = min_element (s); std::min_element för typer som inte har < Överlagring med en template-parameter: LESS (en egenskapsklass) template <class IT, class LESS > IT min_element (IT first, IT last, LESS cmp ) IT m = first ; for (IT i = ++ first ; i!= last ; ++i) if (cmp (*i, *m)) m = i; return m; LESS måste ha operator() och typerna måste stämma, t ex: class Str_Less_Than public : bool operator () ( const char *s1, const char *s2) return strcmp (s1, s2) < 0; ; 6. Typer, pekare och konstanter. 13/32 6. Typer, pekare och konstanter. 14/32 std::min_element för typer som inte har < Strukturer Åtkomst av struct-medlemmar Exempel på användning med stränglista: list < const char *> tl = " hej ", "du", " glade " ; Str_Less_Than lt; // funktionsobjekt cout << * min_element (tl.begin (), tl.end (), lt ); Str_Less_Than-objektet kan skapas direkt i parameterlistan: cout << * min_element (tl.begin (), tl.end (), Str_Less_Than ()); (C++11) lambda: anonymt funktions-objekt auto cf= []( const char * s, const char * t) return strcmp (s,t ) <0;; cout << * min_element (tl.begin (), tl.end (), cf ); Struct Point int x; int y; Point p; Point & rp; Point * pp;... int i = p.x; // å tkomst via namn (på variabel ) int j = rp.x; // å tkomst via referens ( alias för namn ) int k = pp ->x; // å tkomst via pekare 6. Typer, pekare och konstanter. 15/32 Pekare och konstanter 6. Typer, pekare och konstanter. 16/32 Access av medlemmar via pekare Operatorn -> Typer Två sorters konstanter Givet en pekare p, så kan vi uttrycka Medlemmen x i objektet som p pekar på på två sätt: p->x (*p).x En variabel deklarerad const får inte ändras (final i Java) Betyder ungefär Jag lovar att inte ändra denna variabel. Kontrolleras av kompilatorn Används ofta för att specificera gränssnitt En funktion som inte ändrar värdet på argument En medlemsfunktion ( metod ) som inte ändrar objektets tillstånd. Viktigt vid (medlems-)funktionsöverlagring En variabel deklarerad constexpr måste ha ett värde som kan beräknas vid kompilering. Används för att specificera konstanter Infördes i C++-11 Pekare och konstanter : Operatorn -> 6. Typer, pekare och konstanter. 17/32 Pekare och konstanter : Konstanter 6. Typer, pekare och konstanter. 18/32

Medlemsfunktioner kan vara const Funktioner kan vara constexpr Betyder att de inte ändrar objektets tillstånd Viktigt vid överlagring T func(int) och T func(int) const är olika funktioner exempel: class Container public : double & operator [](); double operator []() const ; ; Betyder att de kan beräknas vid kompilering om argumenten är constexpr exempel: constexpr int square ( int x) return x*x; void test_constexpr_fn () char matrix [ square (4) ]; cout << " sizeof ( matrix ) = " << sizeof ( matrix ) << endl ; Utan constexpr får man felet error : variable length arrays are a C99 feature Pekare och konstanter : Konstanter 6. Typer, pekare och konstanter. 19/32 Pekare och konstanter : Konstanter 6. Typer, pekare och konstanter. 20/32 const och pekare const och pekare Exempel const modifierar allt som står till vänster om (undantag: om const står först modifieras det som kommer omedelbart efter) Exempel int * ptr ; const int* ptrtoconst ; // NB! ( const int) * int const * ptrtoconst, // ekvivalent, tydligare? int * const constptr ; // pekaren är konstant const int* const constptrtoconst ; // Både pekare och vä rde int const * const constptrtoconst ; // ekvivalent, tydligare? Var noggrann när du läser: char * strcpy (char *dest, const char *src ); void Exempel ( int * ptr, int const * ptrtoconst, int * const constptr, int const * const constptrtoconst ) *ptr = 0; // OK: ä ndrar inneh å llet ptr = nullptr ; // OK: ä ndrar pekaren * ptrtoconst = 0; // Fel! kan inte ä ndra inneh å llet ptrtoconst = nullptr ; // OK: ä ndrar pekaren * constptr = 0; // OK: ä ndrar inneh å llet constptr = nullptr ; // Fel! kan inte ä ndra pekaren * constptrtoconst = 0; // Fel! kan inte ä ndra inneh å llet constptrtoconst = nullptr ; // Fel! kan inte ä ndra pekaren (const char)*, inte const (char*) Pekare och konstanter : Konstanter 6. Typer, pekare och konstanter. 21/32 Pekare och konstanter : Konstanter 6. Typer, pekare och konstanter. 22/32 Pekare char[], char* och const char* const är viktigt för C-strängar Pekare på konstanter och konstant pekare int k; // ä ndringsbar int int const c = 100; // konstant int int const * pc; // pekare till konstant int int *pi; // pekare till ä ndringsbar int pc = &c; // OK pc = &k; // OK, men k kan inte ä ndras via *pc pi = &c; // FEL! pi får ej peka på en konstant *pc = 0; // FEL! pc pekar på en konstant En string literal (t ex "I am a string literal") är const. Kan lagras i icke-skrivbart minne char* str1 = "Hello"; deprecated i C++ ger varning const char* str2 = "Hello"; OK, strängen är const char str3[] = "Hello"; str3 går att ändra int * const cp = &k; // Konstant pekare cp = nullptr ; // FEL! Pekaren ej flyttbar *cp = 123; // OK! Ä ndrar k till 123 Pekare och konstanter : Konstanter 6. Typer, pekare och konstanter. 23/32 Pekare och konstanter : Konstanter 6. Typer, pekare och konstanter. 24/32

Implicita Typomvandlingar 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) 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 6. Typer, pekare och konstanter. 25/32 Typomvandlingar 6. Typer, pekare och konstanter. 26/32 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. 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 Varnande exempel struct Point int x; int y; ; Point ps [3]; struct Point3d int x; int y; int z; ; Point3d * foo = ( Point3d *) ps; ps: x: y: x: y: x: y: 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 6. Typer, pekare och konstanter. 27/32 Typomvandlingar 6. Typer, pekare och konstanter. 28/32 specialfall: void-pekare Nästa föreläsning 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. Felhantering, exceptions (5.6, 18.1.1) Dynamiskt minne och smarta pekare (12.1) unique_ptr (12.1.5) Typomvandlingar 6. Typer, pekare och konstanter. 29/32 Sammanfattning 6. Typer, pekare och konstanter. 31/32

Läsanvisningar Pekare och textsträngar C-strängar Lagring i minnet null-terminerad: tecknet \0 markerar slutet på strängen Referenser till relaterade avsnitt i Lippman const och constexpr 2.4 C-strängar (char*) 3.5.4 3.5.5 Typomvandingar 4.11 16.1.1 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 Sammanfattning 6. Typer, pekare och konstanter. 32/32 C-strängar 6. Typer, pekare och konstanter. 33/32 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 Pekare och textsträngar Puzzle Corner version av strlen (ger stränglängden) // av const char * för // att garanterat inte ä ndra något int strleng ( const char *s) const char *p; // Pekaren kan ä ndras! for (p = s; *p++; ); return p-s -1; C-strängar 6. Typer, pekare och konstanter. 34/32 C-strängar 6. Typer, pekare och konstanter. 35/32 Funktionspekare Funktionspekare Pekare kan också peka på funktioner double hypotenuse ( int a, int b) return sqrt ( a*a + b*b); double mean ( int x, int y) return static_cast <double >(x+y )/2; int main () double (* pf )( int, int ); pf = hypotenuse ; cout << " hypotenuse : " << pf (3,4) << endl ; pf = mean ; cout << " mean : " << pf (3,4) << endl ; Funktionspekare kan vara argument till funktioner float eval ( float (*f)( int,int ), int m, int n) return f(m, n); float hypotenuse ( int a, int b) return sqrt (( float )(a*a + b*b)); float mean ( int x, int y) return (( float )(x + y ))/2; int main () cout << eval ( hypotenuse, 3, 4) << endl ; cout << eval ( mean, 3, 4) << endl ; Funktionspekare 6. Typer, pekare och konstanter. 36/32 Funktionspekare 6. Typer, pekare och konstanter. 37/32

Funktionspekare Alternativ i C++ Funktionspekare finns i C. I C++ finns även funktor: klass med operator() lambda: anonym funktor Funktionspekare 6. Typer, pekare och konstanter. 38/32