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



Relevanta dokument
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

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

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

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

Dynamisk bindning och polymorfism

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

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

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

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

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

TDIU01 Programmering i C++

Introduktion till arv

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

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

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

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

Programsystemkonstruktion med C++

Arv bakgrund (kap. 9)

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

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

Innehåll. Pekare Exempel

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

TDDC76 - Programmering och Datastrukturer

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

Innehåll. Pekare Exempel

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

C++ Objektorientering - Klasser. Eric Elfving

Java, klasser, objekt (Skansholm: Kapitel 2)

1 Klasser och objektorientering Vad är objektorientering?

5 Arv och dynamisk bindning FIGUR

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

TDDC76 Programmering och datastrukturer

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

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

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

Klasshierarkier - repetition

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

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

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

allokeras på stacken dynamiskt new delete

1. Klass med en dynamiskt allokerad variabel, definitionsfilen-del Klass med en dynamiskt allokerad variabel, inkluderingsfilen.

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

Arv. Objektorienterad och komponentbaserad programmering

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Skapa, kopiera och destruera klassobjekt

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

TDDC76 - Programmering och Datastrukturer

OOP Objekt-orienterad programmering

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

Det finns många flaggor till g++,

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

JAVA Mer om klasser och objektorientering

Imperativ programmering. Föreläsning 4

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

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

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


Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

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

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

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

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

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

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

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

Tentamen EDAF30 Programmering i C++

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

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

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

Övningar Dag 2 En första klass

OOP Objekt-orienterad programmering

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Objektorienterad Programmering (TDDC77)

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

Malmö högskola 2007/2008 Teknik och samhälle

C++-programmets beståndsdelar

Objekt och klasser - Introduktion

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

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Lösningsförslag övning 2.

TDDC76 - Programmering och Datastrukturer

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

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

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

maxlist-1. Indexerad lista Länkad lista

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning 3-4 Innehåll

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

Polymorfi. Objektorienterad och komponentbaserad programmering

Transkript:

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

Objektorienterad programutveckling Innehåll Grundläggande begrepp Relationer mellan objekt Grafisk representation Implementering i C++ Objektorienterad programmering EDA623 (Föreläsning 5) HT 2013 2 / 33

Objektorienterad programutveckling Grundläggande begrepp Objekt Klass Representation av verkligt föremål Egenskaper - Attribut Operationer - Metoder Beskrivning av en viss typ av objekt Ett objekt sägs vara en instans av en klass EDA623 (Föreläsning 5) HT 2013 3 / 33

Objektorienterad programutveckling Relationer mellan objekt Association känner till Bil Person (ägare) Komposition har Bil Motor Generalisering är Bil Fordon EDA623 (Föreläsning 5) HT 2013 4 / 33

Objektorienterad programutveckling Grafisk representation UML (Universal Modeling Language) EDA623 (Föreläsning 5) HT 2013 5 / 33

Objektorienterad programutveckling Relationer mellan objekt Association känner till Person *owner; Komposition har Motor m; Generalisering är class Bil : public Fordon {... }; EDA623 (Föreläsning 5) HT 2013 6 / 33

Objektorienterad programutveckling Objektorienterad programmering Inkapsling (information hiding) Samla alla objektegenskaper på ett ställe i programmet. Gömma ett objekts detaljer för användaren Arv Återanvända tidigare objektspecifikationer (=klasser) för att specialisera genom tillägg av egenskaper Polymorfism Virtuella funktioner Överlagring av funktioner (el. operatorer) Generiska programenheter (mallar (templates) i C++) EDA623 (Föreläsning 5) HT 2013 7 / 33

Polymorfism Virtuella funktioner Betydelsen hos en funktion bestäms först vid exekvering (dynamisk el. sen bindning (late binding)) Överlagring av funktioner Betydelsen hos en funktion bestäms av antal och typ av parametrarna. Detta bestäms vid kompileringen (statisk binding (early binding) ) Generiska programenheter (mallar i C++) Enheter där ett antal av de ingående typerna är generella (typerna anges som indata vid användning av enheten). Ex.: En vektor där elementen är av godtycklig typ (statisk bindning) EDA623 (Föreläsning 5) HT 2013 8 / 33

Klasser Klassdefinitioner Placering av klasser Konstruktorer Destruktorer EDA623 (Föreläsning 5) HT 2013 9 / 33

Klassdefinitioner Klass Egendefinierad typ Objekt Instans av en klass (ett slags variabel) Typisk klassdefinition: class Klassen { public: // Den utåt synliga delen // Medlemsfunktioner (dekl.) // och ev. datamedlemmar private: // Den dolda delen // Datamedlemmar och // ev. medlemsfunktioner }; // Alltid semikolon efter klassdef. EDA623 (Föreläsning 5) HT 2013 10 / 33

Klassdefinitioner Medlemsfunktioner (<==> metoder i Java) class Klassen { public: int fun(int, int); // Deklaration //... }; // Obs! Semikolon här... // Definition av funktionen: int Klassen::fun(int x, int y) { //... } //... men inget semikolon här! EDA623 (Föreläsning 5) HT 2013 11 / 33

Klassdefinitioner 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 Anges genom att skriva funktionsdefinitionen direkt i klassdefinitionen Om funktionen läggs utanför klassdefinitionen (via ::-notation) används nyckelordet inline framför EDA623 (Föreläsning 5) HT 2013 12 / 33

Klassdefinitioner Inline i klassdefinitionen: class Klassen { public: int getvalue() {return value;} //... }; Inline utanför klassdefinitionen: inline int Klassen::getValue() { return value; } EDA623 (Föreläsning 5) HT 2013 13 / 33

Placering av klasser Klassdefinitionen läggs i en headerfil (.h) För att inte riskera att definiera en klass mer än en gång används direktiv: #ifndef KLASSEN_H #define KLASSEN_H //... class Klassen { //... }; #endif // Visual Studio använder istället: #pragma once Medlemsfunktioner läggs i en vanlig fil (.cpp) EDA623 (Föreläsning 5) HT 2013 14 / 33

Konstruktorer Initiering på vanligt sätt fungerar ej (före C++11): class Klassen { public: //... private: int value=0; //Ger kompileringsfel (före C++11) //... }; Initiering sker istället via en speciell medlemsfunktion kallad konstruktor vilken har samma namn som klassen (som i Java) EDA623 (Föreläsning 5) HT 2013 15 / 33

Konstruktorer Initiering möjlig i C++11: class Klassen { public: //... private: int value{0}; //Endast C++11 //... }; EDA623 (Föreläsning 5) HT 2013 16 / 33

Exempel: Bankkonto Klassdefinition class Bankkonto { public: // Konstruktorer läggs här int insattning(int belopp); int uttag(int belopp); void kontobesked(); private: int saldo; char kontonr[10]; }; EDA623 (Föreläsning 5) HT 2013 17 / 33

Exempel: Bankkonto Deklaration av konstruktorer // Placeras i klassdefinitionen Bankkonto(); Bankkonto(char* knr); Bankkonto(char* knr, int saldo); EDA623 (Föreläsning 5) HT 2013 18 / 33

Exempel: Bankkonto Definition av konstruktorer Bankkonto::Bankkonto() { strcpy(kontonr,"saknas"); saldo = 0; } Bankkonto::Bankkonto(char* knr) : saldo(0) { strcpy(kontonr, knr); } Bankkonto::Bankkonto(char* knr, int sald) : saldo(sald) { strcpy(kontonr, knr); } EDA623 (Föreläsning 5) HT 2013 19 / 33

Exempel: Bankkonto Definition av medlemsfunktioner int Bankkonto::insattning(int belopp) { if (belopp > 0) { saldo += belopp; return 1; } else return 0; } EDA623 (Föreläsning 5) HT 2013 20 / 33

Exempel: Bankkonto Definition av medlemsfunktioner int Bankkonto::uttag(int belopp) { if (belopp > 0 && belopp < saldo) { saldo -= belopp; return 1; } else return 0; } EDA623 (Föreläsning 5) HT 2013 21 / 33

Exempel: Bankkonto Definition av medlemsfunktioner void Bankkonto::kontobesked() { cout << "KONTOBESKED" << endl; cout << "Kontonr: " << kontonr <<endl; cout << "Saldo: " << saldo << endl << endl; } EDA623 (Föreläsning 5) HT 2013 22 / 33

Exempel: Bankkonto Hantering av objekt Bankkonto konto("1-234-567"), *pkonto; konto.insattning(20000); konto.kontobesked(); pkonto = new Bankkonto("3-425-167"); pkonto->insattning(25000); konto.uttag(1200); pkonto->kontobesked(); konto.kontobesked(); EDA623 (Föreläsning 5) HT 2013 23 / 33

Exempel: Bankkonto Hantering av objekt Utskrifter KONTOBESKED Kontonr: 1-234-567 Saldo : 20000 KONTOBESKED Kontonr: 3-425-167 Saldo : 25000 KONTOBESKED Kontonr: 1-234-567 Saldo : 18800 EDA623 (Föreläsning 5) HT 2013 24 / 33

Konstruktorer Defaultkonstruktor Definieras automatiskt om det inte finns någon konstruktor alls definierad Svarar mot en konstruktor utan parametrar Får ha parametrar med defaultvärden // I klassdekl. Bankkonto(char* knr="?", int saldo=0); // fungerar även som defaultkonstruktor //...Anrop av defaultkonstruktorn... Bankkonto mitt_konto; //... sker här Bankkonto *pkonto; pkonto = new Bankkonto; //... och här EDA623 (Föreläsning 5) HT 2013 25 / 33

Konstruktorer 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 Bankkonto konto1("5-346-712", 12500); Bankkonto konto2 = konto1; // Här anropas // kopieringskonstruktorn... Bankkonto konto3; konto3 = konto1; //... men inte här EDA623 (Föreläsning 5) HT 2013 26 / 33

Konstruktorer Typomvandlingskonstruktor Anropas då konstruktorn anropas med uttryck av annan typ class KomplextTal { public: KomplextTal():re(1),im(0) {} //Default KomplextTal(const KomplextTal& c); //Kopiering KomplextTal(float x):re(x),im(0) {} //Typomv. //... private: float re, im; } EDA623 (Föreläsning 5) HT 2013 27 / 33

Destruktorer 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 tilde ( ~ )) ~Bankkonto(); // Dekl. av destruktor EDA623 (Föreläsning 5) HT 2013 28 / 33

Exempel: Vektor Klassdefinition class Vektor { public: 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); private: int *p; // Själva vektorn int ant;// Antalet element }; EDA623 (Föreläsning 5) HT 2013 29 / 33

Exempel: Vektor Konstruktorer Vektor::Vektor(int lng) : ant(lng) { assert(ant>=0); // Indexkontroll 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]; } EDA623 (Föreläsning 5) HT 2013 30 / 33

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; } EDA623 (Föreläsning 5) HT 2013 31 / 33

Exempel: Vektor Destruktorn //Deallokera allt dynamiskt minnesutrymme Vektor::~Vektor() { delete [] p; } // Passar egentligen bättre // med inline i klassdeklarationen: //... ~Vektor() {delete [] p;} //... EDA623 (Föreläsning 5) HT 2013 32 / 33

Exempel: Vektor Skapande och destruktion i ett block { Vektor v; // Konstruktor anropas Vektor *pv; pv = new Vektor; // Konstruktoranrop //... delete pv; // Destruktor anropas } // Destruktor anropas även här // då vi lämnar blocket // för att ta kål på v (lokal var.) EDA623 (Föreläsning 5) HT 2013 33 / 33