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

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

allokeras på stacken dynamiskt new delete

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

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

Dynamisk bindning och polymorfism

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

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

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 Arv. EDA623 (Föreläsning 6) HT / 42

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

Programsystemkonstruktion med C++

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

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

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

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

Skapa, kopiera och destruera klassobjekt

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

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

TDIU01 Programmering i C++

5 Arv och dynamisk bindning FIGUR

Kapitel 6 - Undantag

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

TDDC76 - Programmering och Datastrukturer

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

Innehåll. Pekare Exempel

TDDC76 Programmering och datastrukturer

C++ Objektorientering - Klasser. Eric Elfving

Innehåll. Pekare Exempel

Arv bakgrund (kap. 9)

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

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

Introduktion till arv

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

Det finns många flaggor till g++,

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

F8: Typkonvertering i C++

Tillämpad programmering

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

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

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

DAT043 - Föreläsning 7

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

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

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

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

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

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Polymorfi. Objektorienterad och komponentbaserad programmering

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

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

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

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

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

Objektorienterad programmering

Föreläsning 5-6 Innehåll

Inledande programmering med C# (1DV402) Tärningarna ska kastas

1 Namnkontroll (NameControl)

Objektorienterad Programmering (TDDC77)

C++-programmets beståndsdelar

3. Minneshantering - (copy)konstruktorn, destruktorn och tilldelningsoperatorn

Arv. Objektorienterad och komponentbaserad programmering

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

Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd

Klasshierarkier - repetition

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

Objektorienterad programmering Föreläsning 5

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

Kapitel 5. Strömmar. Utmatning

SP:PROG3 HT12 Tenta

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

Generiska konstruktioner. Kursbokens kapitel 13

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

Exempelvis pekarvariabler blir då lättare korrekt deklarerade och initierade.

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

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

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

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

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

Objekt och klasser - Introduktion

OOP Objekt-orienterad programmering

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

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

TUTORIAL: KLASSER & OBJEKT

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Classes och Interfaces, Objects och References, Initialization

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

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

Transkript:

Kapitel 2 Klasser Medlemmar Arv, medlemmar och arv Klasser, åtkomst Medlemmar, medlemsfunktioner, inline och destruktorer this-pekaren Arv, åtkomst Multipelt arv, virtuell basklass Konstanta funktioner och data, mutable 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 2 Klasser Medlemmar Åtkomst Statiska variabler Klasser Klasser används för att strukturera koden kapsla in data knyta metoder till data skapa återanvändbara komponenter 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 4 2D1387 Programsystemkonstruktion med C++ 1

Medlemmar och åtkomst Alla kommer åt public Endast subklasser kommer åt Endast klassen själv kommer åt private Medlemmar och åtkomst class Account // tillgängliga för alla void deposit(double d) balance += d; void withdraw(double d) balance -= d; double balance; // glöm inte semikolon! // endast tillgänglig i klassen int main() Account savings; savings.deposit(10); savings.withdraw(3.50); return 0; 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 5 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 6 Medlemmar och åtkomst Medlemsfunktioner som definieras i klassdeklarationen blir inline /* myfile.h -- headerfil med deklarationer */ class A int i; // i är private // foo är inline int foo(char) return 7; int bar(); // bar, baz är inline om char baz(); // definitionen anger det double d; inline int A::bar() return 2; // inline i.h-fil Statiska medlemmar Statiska medlemmar är gemensamma för alla instanser av samma klass De kan t.ex. användas till att räkna instanser av klassen /* myfile.cpp -- källkodsfil med definitioner */ char A::baz() return 'x'; // ej inline i.cpp-fil 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 7 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 8 2D1387 Programsystemkonstruktion med C++ 2

Statiska medlemmar class A // i headerfil myfile.h static const int size = 4711; // statisk medlem static int cnt; // statisk medlem int array[size]; // vanlig medlem static int count() return cnt; // statisk funktion // i implementationsfil myfile.cpp const int A::size; // statiska medl. måste definieras int A::cnt; // och defaultvärde är 0 int i = A::count(); Konstruktion och destruktion Implicita konstruktorer Initieringslistan Destruktorer 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 9 När ett objekt instansieras anropas dess konstruktor Konstruktorn saknar returtyp En implicit konstruktor tillhandahålls av kompilatorn vid behov och kör konstruktorn på alla objekt i klassen Konstruktorn utan argument kallas defaultkonstruktor och anropas vid konstruktion utan argument Konstruktorn har samma namn som klassen Konstruktorns jobb är att initiera objektet class A A() i = 0; int i; // konstruktor // konstruktorns kropp 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 11 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 12 2D1387 Programsystemkonstruktion med C++ 3

och initieringslistan Vissa typer kan inte tilldelas, bara initieras Tilldelning är onödigt arbete om objktet istället kan initieras till rätt värde Använd initieringslistan för initiering av allt data i klassen Initiera pekare till NULL och allokera eventuellt dynamiskt minne i kroppen och initieringslistan class A A(int &v) // konstruktor : p(0), ref(v), str("hello") // initieringslista // tom kropp int *p; int &ref; std::string str; 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 13 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 14 kan överlagras Använd explicit då konstruktorn har ett argument av enkel typ för att undvika ofrivillig konvertering Exempel på överlagrad konstruktor och explicit // date.h -- headerfil class Date Date(const Date &); // kopieringskonstruktor Date(int y, int m, int d); // ÅÅMMDD explicit Date(int c); // dagar från 1900-01-01 int year, month, date; // date.cpp -- källkodsfil Date::Date(const Date &d) /* kopiering */ Date::Date(int y, int m, int d) : year(y), month(m), date(d) // initiering av medl. 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 15 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 16 2D1387 Programsystemkonstruktion med C++ 4

Lite överkurs: Konstruktor som är ger klass som bara kan skapas av subklasser Konstruktor som är private ger möjlighet att förhindra användandet av t.ex. kopieringskonstruktorn Överkurs - att förhindra kopior av ett objekt: Kopieringskonstruktorn och tilldelningsoperatorn är privata De saknar definition, så om de används (kan endast ske i OS pga private) så får man länkarfel class OS // Operating System OS() // konstruktor private: OS(const OS &); // ingen definition const OS &operator=(const OS &); 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 17 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 18 Destruktorn När ett objekt förstörs (t.ex. med delete eller då det hamnar utom räckvidd) anropas dess destruktor Destruktorn i en basklass bör vara deklarerad virtual Destruktorn har ingen returtyp och tar inga argument Syntaxen för destruktorn ~A() kommer från operatorn för bitvis komplement (~), dvs icke Destruktorn // ligger i string.h -- headerfil class String String() : str(0) // defaultkonstruktor String(const char *s); // kopierar s ~String(); // destruktor char *str; // ligger i string.cpp -- källkodsfil String::String(const char *s) : str(0) str = new char[strlen(s) + 1]; // glöm inte '\0' strcpy(str, s); String::~String() delete [] str; // obs! delete[] 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 19 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 20 2D1387 Programsystemkonstruktion med C++ 5

this-pekaren I en medlemsfunktion kan man komma åt objektet genom att använda den fördefinierade pekaren this this går inte att tilldela this-pekaren class MyInt int i; MyInt &increase(int); inline MyInt &MyInt::increase(int j) i += j; return *this; // ger referens till objektetet självt 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 21 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 22 Arv Arv Aggregation Åtkomst Multipelt arv Virtuella basklasser Arv och aggregation Återanvändning kan ske genom: Aggregat (innehållande), har en Arv, är en class Animal // Animal innehåller (har en) sträng std::string species; // Bear ärver (är en) Animal class Bear : public Animal 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 24 2D1387 Programsystemkonstruktion med C++ 6

Arv och konstruktorer I en arvskedja måste basklasserna initieras före objektets kropp körs Annars skulle man kunna använda oinitierade referenser och konstanter som ligger i basklassen Basklassens konstruktor körs alltid först i initieringslistan Anges inget anrop till basklass anropas dess defaultkonstruktor Arv och konstruktorer Antag arvshierarki A B C och skapandet av ett objekt av typen C Exekveringsordningen blir: Initieringslistan för C anropar initieringslistan för B som anropar initieringslistan för A Initieringslistan för A utförs Kroppen för A utförs Initieringslistan för B utförs Kroppen för B utförs Initieringslistan för C utförs Kroppen för C utförs 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 25 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 26 Arv och konstruktorer Arv och åtkomst class Vehicle Vehicle(int w) : weight(w) int weight; class Car : public Vehicle Car(int p, int w) : Vehicle(w), persons(p) int persons; Car volvo(5, 1700); int i = volvo.weight; Olika typer av arv: public, ochprivate funktion public private arv public public private private private 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 27 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 28 2D1387 Programsystemkonstruktion med C++ 7

Åtkomst vid arv Klasser som är till hjälp för implementationen bör ärvas private Man vill inte ha implementationsdetaljer i sitt gränssnitt Multipelt arv C++ stöder multipelt arv av godtyckligt antal klasser. class Boat Boat(bool s) : has_sail(s) bool has_sail; class Amphibian : public Car, public Boat Amphibian(int pers, int wt, bool sail = false) : Car(pers, wt), Boat(sail) 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 29 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 30 Virtuell basklass För att använda gemensamt data i en delad basklass använder man virtuella basklasser genom nyckelordet virtual. Vanligt arv A A B D C Bv Virtuellt arv Av Dv Cv Virtuell basklass Ett exempel på hur data kan delas mellan basklasserna: class A int i; class B : public A class C : public A class D : public B, public C class Bv : virtual public A class Cv : virtual public A class Dv : public Bv, public Cv Dv dv; dv.a::i = 7; dv.bv::i = 8; dv.cv::i = 9; D d; d.a::i = 7; d.b::i = 8; d.c::i = 9; // alla ändrar samma data // fel: tvetydigt // ok: ändrar D->B->A1 // oj, ändrar D->C->A2 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 31 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 32 2D1387 Programsystemkonstruktion med C++ 8

const Deklarationer med const ger skrivskydd. class A const int ci; // ci är skrivskyddad (ssk) const int *p_ci; // pekare till ssk int int *const cp_i; // ssk pekare till int const int *const cp_ci; // ssk pekare till ssk int int get() const; // objektet är ssk i get int i; // källkodsfil int A::get() const return i; // ok: ändrar inte int A::get() const return i = 2; // fel: ändrar obj const och this this-pekaren går inte att tilldela, dvs pekaren går inte att flytta eftersom den är skrivskyddad Pekaren är deklarerad T *const this; då funktionen inte är const Pekaren är deklarerad const T *const this; då funktionen är const 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 33 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 34 const och mutable Funktioner deklarerade med const gör objektet read-only. Med mutable inför man ett undantag. class A int get() const; // objektet är read-only i get int i; mutable int access_count; inline int A::get() const access_count++; return i; // ok: får ändras trots const 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002 35 2D1387 Programsystemkonstruktion med C++ 9