Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

allokeras på stacken dynamiskt new delete

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

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

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

C++-programmets beståndsdelar

Dynamisk bindning och polymorfism

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

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

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

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

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

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

Programsystemkonstruktion med C++

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

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

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

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

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

Det finns många flaggor till g++,

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

Kapitel 6 - Undantag

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

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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

5 Arv och dynamisk bindning FIGUR

Innehåll. Pekare Exempel

Skapa, kopiera och destruera klassobjekt

Innehåll. Pekare Exempel

Arv bakgrund (kap. 9)

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

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

TDDC76 - Programmering och Datastrukturer

TDIU01 Programmering i C++

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

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

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

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

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

TDDC76 - Programmering och Datastrukturer

C++ Objektorientering - Klasser. Eric Elfving

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

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

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

Introduktion till arv

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

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

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

Tillämpad programmering

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

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

TDDC76 Programmering och datastrukturer

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

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

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

TDDC76 - Programmering och Datastrukturer

Polymorfi. Objektorienterad och komponentbaserad programmering

1 Namnkontroll (NameControl)

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

DAT043 - Föreläsning 7

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

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

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

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

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

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

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

OOP Objekt-orienterad programmering

TDDC76 - Programmering och Datastrukturer

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

Arv. Objektorienterad och komponentbaserad programmering

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

Föreläsning 5-6 Innehåll

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

Tommy Färnqvist, IDA, Linköpings universitet

Objektorienterad Programmering (TDDC77)

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

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

F8: Typkonvertering i C++

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

1 Klasser och objektorientering Vad är objektorientering?

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

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

Objekt och klasser - Introduktion

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

TDIU01 - Programmering i C++, grundkurs

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

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

Classes och Interfaces, Objects och References, Initialization

Klasshierarkier - repetition

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

Transkript:

Minneshantering Lokala objekt allokeras på stacken och har kort livslängd Objekt med längre livslängd måste allokeras dynamiskt på heapen (free store) Dynamisk allokering görs med new och delete Statiska och globala objekt finns under programmets hela körtid Minneshantering Minne (objekt) som allokerats med new ska deallokeras med delete Minne (vektorer av objekt) som allokerats med new[] ska deallokeras med delete[] void foo() A a; // a allokerad på stacken A *ap = new A; // dynamiskt allokerad A *aa = new A[5]; // vektor med 5 A-objekt delete ap; // frigör allokerat minne delete aa; // fel: odefinierat beteende! delete [] aa; // ok: destruktor för 5 element } /* vid funktionens slut frigörs a automatiskt */ Minneshantering C++ har ingen automatrisk minneshantering (garbage collection) Alla dynamiska objekt som inte lämnas tillbaka läcker minne Speciellt viktigt är det att hålla ordning på minnet i objekt som skapas och destrueras ofta som t.ex. strängar. Undvik pekare Undvik pekare! Det är lätt att referera otillåtet minne (t.ex. genom att avreferera NULL) Det är lätt att referera ogiltigt minne (redan frigjort med delete) Skapa istället objekt på stacken Använd referenser! Dessa är garanterade att alltid referera ett giltigt objekt 2D1387 Programsystemkonstruktion med C++ 1

Exempel på hur referenser och pekare används som alias för ett objekt class A int i; Referenser A a; // objekt A &arf; // fel: arf måste initieras A &ar = a; // ok: ar refererar a int i; i = a.i; // vi kommer åt a.i genom a i = ar.i; // ar används istället för a void foo(const A &); // deklaration foo(a); // skicka a som referens Preprocessor Körs innan programmet ses av kompilatorn Används för att inkludera/exkludera källkod Kan användas för att definiera konstanter och makron C++ har många tekniker för att undvika preprocessorn, såsom inline, template och const Preprocessor #include <iostream> // inkluderar filen iostream #include "myfile.h" // letar i lokal katalog först #ifdef MSDOS // inkludera endast om MSDOS-miljö #include <conio.h> #endif Klasser Medlemmar Åtkomst Statiska variabler 2D1387 Programsystemkonstruktion med C++ 2

Klasser Klasser används för att strukturera koden kapsla in data knyta metoder till data skapa återanvändbara komponenter Medlemmar och åtkomst Alla kommer åt public Endast subklasser kommer åt protected Endast klassen själv kommer åt private Medlemmar och åtkomst class Account p ublic: // tillgängliga för alla void deposit(double d) balance += d; } void withdraw(double d) balance -= d; } p rotected: double balance; // endast tillgänglig i klassen // glöm inte semikolon! int main() Account savings; } savings.deposit(10); savings.withdraw(3.50); return 0; 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 protected: double d; inline int A::bar() return 2; } // inline i.h-fil /* myfile.cpp -- källkodsfil med definitioner */ char A::baz() return 'x'; } // ej inline i.cpp-fil 2D1387 Programsystemkonstruktion med C++ 3

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 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 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 2D1387 Programsystemkonstruktion med C++ 4

Konstruktorn har samma namn som klassen Konstruktorns jobb är att initiera objektet class A A() // konstruktor i = 0; // konstruktorns kropp } protected: int i; 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 kan överlagras Använd explicit då konstruktorn har ett argument av enkel typ för att undvika ofrivillig konvertering protected: int *p; int &ref; std::string str; 2D1387 Programsystemkonstruktion med C++ 5

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; Lite överkurs: Konstruktor som är protected ger klass som bara kan skapas av subklasser Konstruktor som är private ger möjlighet att förhindra användandet av t.ex. kopieringskonstruktorn // 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. } 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 &); 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 2D1387 Programsystemkonstruktion med C++ 6

Destruktorn // ligger i string.h -- headerfil class String String() : str(0) } // defaultkonstruktor String(const char *s); // kopierar s ~String(); // destruktor protected: char *str; 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 // 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[] 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 } Arv Arv Aggregation Åtkomst Multipelt arv Virtuella basklasser 2D1387 Programsystemkonstruktion med C++ 7

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... 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 Arv och konstruktorer 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; 2D1387 Programsystemkonstruktion med C++ 8

Arv och åtkomst Olika typer av arv: public, protected och private arv funktion public protected private Å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 public public protected private protected protected protected private private 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) } Virtuell basklass För att använda gemensamt data i en delad basklass använder man virtuella basklasser genom nyckelordet virtual. A B Vanligt arv D A C Bv Virtuellt arv Av Dv Cv 2D1387 Programsystemkonstruktion med C++ 9

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; // alla ändrar samma data dv.bv::i = 8; dv.cv::i = 9; D d; d.a::i = 7; // fel: tvetydigt d.b::i = 8; // ok: ändrar D->B->A1 d.c::i = 9; // oj, ändrar D->C->A2 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 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++; // ok: får ändras trots const return i; } 2D1387 Programsystemkonstruktion med C++ 10