TDDC76 - Programmering och Datastrukturer

Relevanta dokument
TDIU01 Programmering i C++

Skapa, kopiera och destruera klassobjekt

TDDC76 - Programmering och Datastrukturer

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

TDDC76 - Programmering och Datastrukturer

C++ Objektorientering - Klasser. Eric Elfving

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

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

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

Dynamisk bindning och polymorfism

TDIU01 - Programmering i C++, grundkurs

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

Trädtraversering. Binärt träd. Trädtraversering djupet-först. Trädtraversering bredden-först

TDDC76 PoD OH Föreläsning C Klasser

Klassmedlemmar. Klasser. Konstruktion av en enskild, icke-trivial klass. Klassen String funktionalitet

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

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

TDIU01 - Programmering i C++, grundkurs

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

TDDC76 Programmering och datastrukturer

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

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

Innehåll. Pekare Exempel

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

Innehåll. Pekare Exempel

Klasser. Konstruktion av en enskild, icke-trivial klass

Klasser. Klassen String funktionalitet. Klassen String funktionalitet, forts. Klassen String funktionalitet, forts. Vad ska man kunna göra?

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

Tillämpad programmering

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

5 Arv och dynamisk bindning FIGUR

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

Introduktion till arv

OOP Objekt-orienterad programmering

maxlist-1. Indexerad lista Länkad lista

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

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

Initiering och tilldelning

Föreläsning 5-6 Innehåll

JAVA Mer om klasser och objektorientering

1 Klasser och objektorientering Vad är objektorientering?

TDDC76 PoD OH Föreläsning C Härledda klasser

TUTORIAL: KLASSER & OBJEKT

Operatoröverlagring. 1 Definition och deklaration av operatorfunktioner. 2 Anrop av operatorfunktioner

Det finns många flaggor till g++,

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

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

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

Objektorientering - Arv och polymorfi

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

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

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

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

Java, klasser, objekt (Skansholm: Kapitel 2)

Arv. Objektorienterad och komponentbaserad programmering

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

TDDI14 Objektorienterad programmering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

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

OOP Objekt-orienterad programmering

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

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

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Kopiering av objekt i Java

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

Övningar Dag 2 En första klass

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

Malmö högskola 2008/2009 CTS

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

F8: Typkonvertering i C++

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

Tillämpad programmering

Lösningsförslag övning 2.

Tommy Färnqvist, IDA, Linköpings universitet

Grundläggande programmering med C# 7,5 högskolepoäng

Övningsuppgift. Repeterbara citat. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

TDDD78 Objektorientering: Lagring och livstid

Föreläsning 13 Innehåll

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

Kommentarer till Person

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

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

Transkript:

TDDC76 - Programmering och Datastrukturer Klasser - speciella medlemsfunktioner Eric Elfving Institutionen för datavetenskap

En klass ansvarar ofta för en resurs. Ibland är resursen så enkel som en datamedlem av inbyggd typ, men vad händer om den är svårare att hantera? Fil på filsystemet Nätverksanslutning... 1 / 18

2 / 18 Inom C++ brukar man använda akronymet RAII - Resource Allocation Is Initialization Fritt översatt betyder det att alla resurshanterande klasser ska ta resursen i sin konstruktor och sedan se till att den återlämnas när man är klar med den.

3 / 18 På samma sätt som vi har konstruktorn för att initiera datamedlemmar har vi en annan speciell medlemsfunktion för att återlämna resurser - destruktorn Destruktorn har alltid namnet ~KLASSNAMN() och saknar även den returntyp Destruktorn körs automatiskt när ett objekt av klasstypen ska försvinna (exempelvis vid slut av det block där en variabel deklarerats)

4 / 18 class My_Ptr public: My_Ptr(int i) : ptr new inti ~My_Ptr() delete ptr; private: int * ptr; ; int main() My_Ptr p16; // p1 initieras My_Ptr p25; // p2 initieras // p2 destrueras // p1 destrueras

5 / 18 Har vi en resurs som kräver speciell hantering för att återlämna måste vi alltid implementera destruktorn. I annat fall kan kompilatorn själv generera denna

6 / 18 Kopiering av objekt Kompilatorn kan också generera stöd för kopiering av objekt utan att vi gör något speciellt int main() My_Ptr t 6; My_Ptr t2 t; Här används en kopieringskonstruktor Den automatgenererade varianten kommer kopiera värdet av varje datamedlem. Detta kan dock ge problem...

7 / 18 Har vi behov av en destruktor har vi troligen även behov av att själva implementera kopiering. Vi behöver kopieringskonstruktor och kopieringstilldelningsoperator class My_Ptr public: My_Ptr(int i): ptr new inti ; My_Ptr(My_Ptr const & other) // kopieringskonstruktor : ptr new int*other.ptr My_Ptr & operator=(my_ptr const & rhs) // kopieringstilldelning delete ptr; ptr = new int *rhs.ptr ; return *this; // this är en pekare till nuvarande objekt

8 / 18 Kopieringskonstruktorn används för att skapa nya objekt som kopior av redan existerande Kopieringstilldelningsoperatorn används för att ändra värde på ett existerande objekt int main() My_Ptr p 5; My_Ptr p2p; p = p2; // vanlig konstruktor // kopieringskonstruktor // kopieringstilldelning

9 / 18 Vi har ett problem med vår kopieringstilldelningsoperator, självtilldelning My_Ptr p 6; p = p;

10 / 18 En vanlig lösning är kontroll för självtilldelning: My_Ptr & My_Ptr::operator=(My_Ptr const & rhs) if ( &rhs!= this ) delete ptr; ptr = new int *rhs.ptr ; return *this;

11 / 18 Oftast löses det smidigare med hjälp av en swap-funktion void My_Ptr::swap(My_Ptr & other) std::swap(ptr, other.ptr); My_Ptr & My_Ptr::operator=(My_Ptr const & rhs) My_Ptr tmprhs; // skapa en kopia av rhs swap(tmp); // byt innehåll med kopian return *this; // kopian (som äger mitt gamla innehåll) destrueras Detta ger idiomet kopiera och byt (copy-and-swap) eller create temporary and swap

12 / 18 Jag skriver oftast enligt nedan: My_Ptr & My_Ptr::operator=(My_Ptr const & rhs) My_Ptrrhs.swap(*this); return *this;

13 / 18 Flyttsemantik Kompilatorn kan hitta många ställen där objekt behöver kopieras Detta kan ta mycket kraft och känns onödigt ibland Därför infördes flyttsemantik i C++11! Målet är att kompilatorn kan se när ett temporärt objekt ska kopieras och istället flytta innehållet

14 / 18 Likt kopiering finns två speciella medlemsfunktioner att överlagra; flyttkonstruktor och flytttilldelningsoperator class My_Ptr public: My_Ptr(My_Ptr && other); // flyttkonstruktor, ta innehållet från other My_Ptr & operator=(my_ptr && rhs); // ta innehållet från rhs ; Lägger vi till (och implementerar) dessa kan kompilatorn själv anropa dem när det passar.

15 / 18 implementation Objektet vi tar ifrån ska lämnas i ett giltigt tillstånd My_Ptr::My_Ptr(My_Ptr && other) : ptr other.ptr other.ptr = nullptr; My_Ptr & operator=(my_ptr && rhs) swap(rhs); return *this;

16 / 18 För att testa dessa kan man använda sig av funktionen std::move från <utility> My_Ptr p 5; My_Ptr p2 move(p) ; Normalt optimerar en modern kompilator bort många kopieringar/flytter. Vill man se hur det ser ut utan optimering kan man använda kompileringsflaggan -fno-elide-constructors

17 / 18 Precis som att det är bra (och ofta nödvändigt) att lägga till const på funktioner som inte modifierar objektet bör man använda noexcept på funktioner som inte kastar undantag. class My_Ptr public: My_Ptr(); My_Ptr(const &); My_Ptr(My_Ptr &&) noexcept; My_Ptr & operator=(my_ptr const &); My_Ptr & operator=(my_ptr &&) noexcept; ; void swap(my_ptr &) noexcept; Om vi kastar ett undantag från en noexcept-markerad funktion dör programmet.

18 / 18 Om man vill kan man även begränsa hur en viss funktion får anropas. Med & i slutet av funktionsdeklarationen får funktionen endast anropas på en variabel. Med && i slutet får den endast anropas på ett temporärt värde. class My_Ptr public: //... My_Ptr & operator=(my_ptr const &) &; //... ; My_Ptr fun(); int main() My_Ptr p 6; fun() = p; // kompileringsfel! p = fun(); // resultatet från fun flyttas in i p

Eric Elfving Institutionen för datavetenskap www.liu.se