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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

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

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

Programsystemkonstruktion med C++

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

Tillämpad programmering

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

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

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

F8: Typkonvertering i C++

Dynamisk bindning och polymorfism

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

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

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

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Det finns många flaggor till g++,

Introduktion till arv

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

TDDC76 Programmering och datastrukturer

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

5 Arv och dynamisk bindning FIGUR

allokeras på stacken dynamiskt new delete

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

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

Innehåll. Pekare Exempel

TDDC76 - Programmering och Datastrukturer

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 6

Kapitel 6 - Undantag

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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

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

Klasshierarkier - repetition

Collections Collections "Envisa" objekt Klasserna Bofstream och Bifstream Definition av metoder i klasserna Bifstream och Bofstream Klassen Streng

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

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursassistent: Mårten Björkman,

TDIU01 - Programmering i C++, grundkurs

Innehåll. Pekare Exempel

Tentamen EDAF30 Programmering i C++

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

TDIU01 Programmering i C++

float Mindre rella tal ( floating point number ) double Rella tal/flyttal ( double precision floating point number )

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

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

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

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

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

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

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

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

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

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

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

Problemet. Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism)

Objektorientering - Arv och polymorfi

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

Konstruktion av klasser med klasser

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

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

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

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

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

1 Namnkontroll (NameControl)

C++-programmets beståndsdelar

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

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

Funktionens deklaration

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDIU01 - Programmering i C++, grundkurs

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

Tillämpad programmering

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Föreläsning 5-7 Operatoröverlagring

TDDC76 - Programmering och Datastrukturer

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

Tentamen i DD2387 Programsystemkonstruktion med C++

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Initiering och tilldelning

Att använda pekare i. C-kod

Arv. Objektorienterad och komponentbaserad programmering

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

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

1 Funktioner och procedurell abstraktion

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

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

Tentamen *:85/2I4123 C

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

Programsystemkonstruktion med C++

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Transkript:

2D1387, Programsystemkonstruktion med C++ 00/01 1 Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning: Synlighet Överlagring av operatorer Slide 1 Vänner till klasser och funktioner Virtuella funktioner och polymor Abstrakta basklasser och strikt virtuella funktioner Pekare till funktioner och medlemsfunktioner Typkonvertering Synlighet Ett problem med moduler i C är att alla variabel- och funktionsnamn ligger globalt synliga. C++ botar detta genom att införa det mycket användbara nyckelordet namespace. För att kapsla in klasser, funktioner och data nns namnrymder genom namespace Slide 2 Med synlighetsoperatorn (scope operator) :: kan man komma åt en namnrymd och medlemmar i klasser Med using exponerar man innehåll i en namnrymd Med odöpta namnrymder (unnamed namespaces) kan man deklarera data som är synliga endast lokalt (påminner mycket om static) för att undvika namnkon ikter mellan namnrymder.

2D1387, Programsystemkonstruktion med C++ 00/01 2 Slide 3 namespace Spc // håll namnen på namnrymder korta class A; // framåt(forward)deklaration int foo(); int j; enum arms = 2, legs = 1, hair = 517 } class Spc::A // A är inte synlig utan Spc:: public : int foo(); int j; inline int Spc::A::foo() return j; } // använder Spc::A::j inline int Spc::foo() return j; } // ok: Spc::j synlig int main() if(spc::j > Spc::legs) // Använd Spc::j, Spc::legs explicit /*...*/ } Slide 4 using Spc::j; j = Spc::foo(); Spc::A a; j = a.foo(); // j synlig i hela main() // Spc::foo() ej synlig, använd Spc:: // ok: Spc::A::foo() synlig genom a using Spc::A; using namespace Spc; // hela klassen A synlig // allt data i Spc synligt } return 0;

2D1387, Programsystemkonstruktion med C++ 00/01 3 Överlagring av operatorer Man kan omde niera operatorerna i C++, dock endast för egna typer såsom klasser, enums etc. Slide 5 class MyInt MyInt &operator=(const MyInt &); // tilldeln. MyInt &operator+=(const MyInt &); // tilldeln. const MyInt &operator+(int); // addition const MyInt &operator+(const MyInt &); // addition... MyInt i, j; i = j + 7; // använd oper+() och oper=() j += 3; // använd oper+=() i.operator+=(j); // operatorer kan användas explicit Slide 6 class B; class A int operator()(int, double); // överlagring av anrop int operator[](int) const; // indexering B *operator[](const char *) const; // (i t.ex. map) A &operator++(int); // postfix inkrement A &operator--(); // prefix dekrement const A operator*(const A &) const; // multiplikation A &operator*() const; // avreferering friend const A operator*(int, const A &); friend ostream &operator<<(ostream &, const A &); const A operator*(int, const A &); // multiplikation ostream &operator<<(ostream &, const A &); // utmatning

2D1387, Programsystemkonstruktion med C++ 00/01 4 Vänner Ibland måste en klass ha tillgång till data i en annan Slide 7 Man vill dock inte använda åtkomsttypen public eftersom man får oönskad insyn Man speci cerar sina vänner (klass eller funktion) med friend De får då åtkomstnivå public på data/funktioner Slide 8 class MyInt int i; // i är private MyInt(int j) : i(j) } friend const MyInt operator*(int, const MyInt &); friend ostream &operator<<(ostream &, const MyInt &); inline const MyInt operator*(int i, const MyInt &j) return MyInt(i * j.i); } // kommer åt MyInt::i inline ostream &operator<<(ostream &s, const MyInt &j) s << "MyInt = " << j.i << "}"; } // kommer åt MyInt::i

2D1387, Programsystemkonstruktion med C++ 00/01 5 Virtuella funktioner Normalt sett: kompilatorn vet vilken funktion som skall köras vid funktionsanrop, statisk bindning Virtuella funktioner: vilken funktion som körs bestäms av vilket objekt funktionen anropats genom, dynamisk bindning. Detta kallas polymor. Slide 9 class A virtual void print() cout << "A" << endl; } class B : public A void print() cout << "B" << endl; } Slide 10 A a; B b; A *ap = &b; A &ar = a; ap->print(); ar.print(); B *bp = &a; // ok: B är subklass till A // ok: ar refererar a // skriver ut "B" // skriver ut "A" // fel: A är inte subklass till B

2D1387, Programsystemkonstruktion med C++ 00/01 6 Virtuella destruktorer För att alla objekt i en arvskedja skall få sina destruktorer anropade krävs att basklassen har en virtuell destruktor. Slide 11 class Av virtual ~Av() } class Bv : public Av ~Bv() } class A ~A() } class B : public A ~B() } B *bp = new B; A *ap = bp; delete ap; // fel?: B's destruktor anropas inte Bv *bvp = new Bv; Av *avp = bvp; delete avp; // ok: B's destruktor anropas Slide 12 Abstrakt basklass En strikt virtuell (pure virtual) funktion tvingar subklasser att ge en de nition. Basklassen kan då inte instantieras och kallas därför abstrakt basklass. class A virtual void print() = 0; // strikt pga '=0' class B : public A void print(); // definition måste ges om // B skall instantieras

2D1387, Programsystemkonstruktion med C++ 00/01 7 Slide 13 void B::print() cout << "B" << endl; }... A a; // fel: A är en abstrakt basklass B b; // ok: B har alla funktioner definierade b.print(); // kör B::print(); Pekare till funktioner Antag att vi har en lista och vill göra något med varje element. En funktionspekare ger oss en möjlighet att slippa upprepa kod. Vi skickar en funktionspekare till en iteratorfunktion. Slide 14 typedef void (*fp)(int &); // funktionspekare int iterate(int a[], int size, fp action) for(int j = 0; j < size; j++) // j giltig i loopen action(a[j]); } void mod3(int &i) i %= 3; } // rest vid division void print(int &i) cout << i << " "; }... int a[7] = 1, 2, 3, 4, 5, 6, 7 iterate(a, 7, mod3); iterate(a, 7, print); // ger utmatning 1 2 3 0 1 2 3

2D1387, Programsystemkonstruktion med C++ 00/01 8 Slide 15 class A void foo(int) } static void bar(int) } typedef void(*fp)(int); fp p1 = &A::foo; // fel: foo är void(a::*)(int) fp p2 = &A::bar; // ok: bar är void(*)(int) typedef void(a::*fpm)(int); fpm p3 = &A::foo; // ok: foo är void(a::*)(int) A a; (a.*p3)(4711); // kör foo från a A *pa = &a; (pa->*p3)(4711); // kör foo från a via pa Typkonvertering Man använder typkonvertering för att göra om en pekare till en klass till en pekare till en annan. Inbyggda datatyper konverterar till varandra Subklasser konverteras till basklassen Slide 16 Pekare utan kvali erare (const) konverterar automatiskt till void-pekare static_cast är konvertering under kompilering dynamic_cast är konvertering som endast kan lösas under körning reinterpret_cast är villkorslös konvertering const_cast tar bort kvali eraren const (detta går inte att göra med någon av ovanstående)

2D1387, Programsystemkonstruktion med C++ 00/01 9 class A virtual int f() } class B : public A int f() } Slide 17 const char inst[] = "C++"; void *p; p = inst; p = (void *)inst; // fel: kastar bort const // ok, men riktigt fult char *s = const_cast<char *>(inst); // ok p = s; // ok: samma kvalifierare s = reinterpret_cast<char *>(p); // ok s = reinterpret_cast<char *>(inst); // fel: const_cast // måste användas Slide 18 B b; A *ap = &b; B *bp = dynamic_cast<b *>(ap); int i = static_cast<int>(3.14); // bp!= 0 eftersom // ap pekar på b // undviker varning