allokeras på stacken dynamiskt new delete

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

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

C++-programmets beståndsdelar

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

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++

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

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

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

Programsystemkonstruktion med C++

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

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

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

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

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

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

Det finns många flaggor till g++,

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

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

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++

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

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

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

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

Introduktion till arv

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

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

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

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

Föreläsning 5-6 Innehåll

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

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.

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

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

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

F8: Typkonvertering i C++

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

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

Exempel på hur referenser och pekare används som alias för ett objekt class A { public: 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

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 public: // 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

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 public: 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 Konstruktorer Implicita konstruktorer Initieringslistan Destruktorer

Konstruktorer 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

Konstruktorer Konstruktorn har samma namn som klassen Konstruktorns jobb är att initiera objektet class A { public: A() // konstruktor { i = 0; // konstruktorns kropp } protected: int i; };

Konstruktorer 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

Konstruktorer och initieringslistan class A { public: A(int &v) // konstruktor : p(0), ref(v), str("hello") // initieringslista {} // tom kropp protected: int *p; int &ref; std::string str; };

Konstruktorer Konstruktorer kan överlagras Använd explicit då konstruktorn har ett argument av enkel typ för att undvika ofrivillig konvertering

Konstruktorer Exempel på överlagrad konstruktor och explicit // date.h -- headerfil class Date { public: 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. { }

Konstruktorer 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

Konstruktorer 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 { public: 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

Destruktorn // ligger i string.h -- headerfil class String { public: String() : str(0) {} // defaultkonstruktor String(const char *s); // kopierar s ~String(); // destruktor protected: 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[]

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; public: 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

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 { public: Vehicle(int w) : weight(w) {} int weight; }; class Car : public Vehicle { public: Car(int p, int w) : Vehicle(w), persons(p) {} int persons; };... Car volvo(5, 1700); int i = volvo.weight;

Arv och åtkomst Olika typer av arv: public, protected och private funktion arv public protected private public public protected private protected protected protected private 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

Multipelt arv C++ stöder multipelt arv av godtyckligt antal klasser. class Boat { public: Boat(bool s) : has_sail(s) {} bool has_sail; }; class Amphibian : public Car, public Boat { public: 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 Vanligt arv A Virtuellt arv Av B C Bv Cv D Dv

Virtuell basklass Ett exempel på hur data kan delas mellan basklasserna: class A { public: 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; }