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

Relevanta dokument
Programsystemkonstruktion med C++

Dynamisk bindning och polymorfism

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

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

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

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

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

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

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Introduktion till arv

TDDC76 - Programmering och Datastrukturer

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

Det finns många flaggor till g++,

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

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

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

Kapitel 6 - Undantag

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

allokeras på stacken dynamiskt new delete

Polymorfi. Objektorienterad och komponentbaserad programmering

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

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

TDDC76 Programmering och datastrukturer

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tillämpad programmering

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDIU01 Programmering i C++

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

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

Programsystemkonstruktion med C++

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

Skapa, kopiera och destruera klassobjekt

5 Arv och dynamisk bindning FIGUR

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

Tillämpad programmering

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

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

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

TDDC76 - Programmering och Datastrukturer

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

Arv. Objektorienterad och komponentbaserad programmering

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

JAVA Mer om klasser och objektorientering

Lösningsförslag övning 2.

Arv bakgrund (kap. 9)

TDDC76 - Programmering och Datastrukturer

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

Klasshierarkier - repetition

Tentamen i DD2387 Programsystemkonstruktion med C++

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

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

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Tentamen EDAF30 Programmering i C++

DAT043 - Föreläsning 7

Objektorienterad Programmering (TDDC77)

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

OOP Objekt-orienterad programmering

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

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

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

OOP Objekt-orienterad programmering

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Problemet. Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism)

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

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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

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

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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

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

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

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

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

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Innehållsförteckning

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

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Transkript:

Programsystem konstruktion med C++ (2D1387) övning 2 klasser och arv Ronnie Johansson rjo@nadakthse grupp 4 2003 09 25 Innehåll Klasskonstruktorer och initieringslistor Klassdestruktorer Åtkomstkontroll medlemmar är public, protected eller private Arv även arv kan vara public, protected eller private Multipelt arv ej möjligt i Java Virtuella funktioner, överlagring (override), polymorfism Abstrakta basklasser Const deklarerade medlemmar och metoder Konstruktorer Objekt skapas 3 stegsraket: 1: Minnesallokering automatiskt minne dynamiskt minne 2: Initiering av medlemmar Styrs via initieringslista (kolonlista) OBS! Följande MÅSTE initieras via kolonlistan const deklarerade medlemmar referenser 3: Exekvering av kod i konstruktorn (funktionskroppen) Student(std::string name) : m_name(name) m_lectures = new (Lecture*)[100]; const std::string name; Lecture **m_lectures; ; "Automatiska" konstruktorer Följande konstruktorer skapas automatiskt defaultkonstruktor kopieringskonstruktor std::string str; int main() A a; astr = "Hallå världen!"; std::cout << astr << std::endl; A b(a); std::cout << bstr << std::endl; Även kopieringsoperatorn skapas "automatiskt" int main() A a; astr = "Hallå igen!"; A b; b = a; std::cout << b << std::endl;

Direkt och indirekt användning av konstruktorer Default och kopieringskonstruktörerna skapas automatisk // Defaultkonstruktorn default constructor A(); // Kopieringskonstruktorn copy constructor A(const A&); Även kopieringsoperatorn skapas automatiskt: // kopiering copy assignment A& operator=(const &A); main () A a1; A a2 = 2; A a3 = a1; a1 = a2; Indirekt typkonvertering class One One() ; class Two Two(One)//konstruktor ; void f(two) int main() One one; f(one); // Vill ha Two, har One Begränsning av användning av konstruktorer För att förhindra användning av konstruktor A(const A&);// behövs ej // definieras För att undvika indirekt typkonvertering explicit A(int); Destruktorer Student(std::string name); ~Student(); const std::string name; Lecture **m_lectures; ; Student::Student(std::string name) : m_name(name) m_lectures = new (Lecture*)[100]; for(int i = 0; i < 100; ++i) m_lectures[i] = 0; Student::~Student() for(int i = 0; i < 100; ++i) if(m_lectures[i]!= 0) delete m_lectures[i]; delete [] m_lectures;

Arv: konstruktorer & destruktorer class ()cout << "" << endl; ~()cout << ~" << endl; class : public class : public Begränsat arv Class B : public/protected/private A class Mule : public, public int main() *a = new (); *h = new (); *d = new ; Mule *m = new Mule(); delete a; delete h; delete d; delete m; Konstruktor Destruktor ~ ~ ~ ~ ~ Mule Mule ~Mule ~ ~ ~ ~ Virtuella funktioner och polymorfism Funktioner i klasser måste vara deklarerade som virtual för att vi ska kunna använda pekare till basklass foo()cout << "A::foo()" << endl; ; Non virtual vs virtual Icke virtuella funktioner väljs statiskt vid kompilering beroende på typ av pekare eller referens Virtuella funktioner bestäms dynamiskt under exekvering baserat på objektets faktiska typ class B : public A foo()cout << "B::foo()" << endl; ; int main() A *b = new B(); b >foo(); Dator>prog a::foo() Class: int m_id std::string name v table V table *func1 *func2 *func3

Virtuella destruktorer Vad är problemet med följande kod? cout << "" << endl; ; class B : public A ~B()cout << "~B()" << endl; ; int main(int argc, char *argv[]) A* a = new A(); A* b = new B(); delete a; delete b; Dator> prog Lösning! virtual cout << "~AV()" << endl; ; Dator> prog ~B() Abstrakta klasser Det går ej att skapa instans av klass som är "abstrakt" För att göra en klass abstrakt, låt någon funktion i klassen vara "rent" virtuell (pure virtual) Ex: virtual Student() = 0; ; Klasser som ärver av basklassen MÅSTE implementera de funktioner som är "pure virtual" för att man ska kunna instantiera ett objekt av klassen Motsvarar "interface" i Java Class Shape virtual void draw() = 0; class Box : public Shape class Circle : public Shape vector<shape *> v; v[1] = new Box(); v[2] = new Circle(); s = v[1]; s >draw(); s = v[2]; s >draw(); Statiska variabler & funktioner Exempel: Singelton klass class Singleton static Singleton& get_instance(); Singleton(); Singleton(const Singleton &s); Singleton& operator=(const Singleton &s); static Singleton *m_instance; ; Singleton* Singleton::m_instance = 0; Singleton& Singleton::get_instance() if(m_instance == 0) m_instance = new Singleton(); return *m_singleton; Operatoröverlagring Varför? Man vill till exmpel kunna skriva: Matrix m3=m1+m2; och överlagra utskriftsoperatorn << 42 operatorer kan överlagras bl a: +, =, <<, ++ (både postfix och prefix), >, (), new, 3 operatorer kan ej överlagras av användaren: ::, och * Självreferens class Complex double re, im; Complex& Complex::operator+=(const Complex c) re += cre; im += cim; return *this;

Exempel: Counter (studenth) Student(std::string name); Student(const Student &s); Student(); static int m_counter; std::string name; int m_student_id; ; (studentcpp) int Student::m_counter = 0; Student::Student(std::string name) : m_name(name), m_id(++m_counter) Student::Student(const Student &s) : m_name(sget_name()), m_id(++m_counter) (maincpp) Student s1("kalle"); Student s2("lotta"); std::cout << s1get_id() << std::endl; std::cout << s2get_id() << std::endl;