Programsystemkonstruktion med C++

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

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

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

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

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

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

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

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

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. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Synlighet. Namespace Scope-operatorn Klasser Vänner

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 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Dynamisk bindning och polymorfism

Det finns många flaggor till g++,

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

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

TDDC76 - Programmering och Datastrukturer

Innehåll. Pekare Exempel

allokeras på stacken dynamiskt new delete

Innehåll. Pekare Exempel

Introduktion till arv

TDIU01 Programmering i C++

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

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

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

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

Programsystemkonstruktion med C++

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

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

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

5 Arv och dynamisk bindning FIGUR

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

C++ Objektorientering - Klasser. Eric Elfving

Tillämpad programmering

Tillämpad programmering

Classes och Interfaces, Objects och References, Initialization

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

Collections Collections "Envisa" objekt Klasserna Bofstream och Bifstream Definition av metoder i klasserna Bifstream och Bofstream Klassen Streng

Arv bakgrund (kap. 9)

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

TDDC76 - Programmering och Datastrukturer

Kapitel 6 - Undantag

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

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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Programmering B med Visual C

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

TDDC76 Programmering och datastrukturer

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

C++-programmets beståndsdelar

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

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

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

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

TDIU01 - Programmering i C++, grundkurs

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

1 Klasser och objektorientering Vad är objektorientering?

Tentamen EDAF30 Programmering i C++

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

TDIU01 - Programmering i C++, grundkurs

1 Namnkontroll (NameControl)

Tentamen i DD2387 Programsystemkonstruktion med C++

C++ - En introduktion

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Polymorfi. Objektorienterad och komponentbaserad programmering

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

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

Tentamen i DD2387 Programsystemkonstruktion med C++

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

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

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

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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

Tentamen *:85/2I4123 C

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

Skapa, kopiera och destruera klassobjekt

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

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

Övningar Dag 2 En första klass

Föreläsning 5-6 Innehåll

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Klasshierarkier - repetition

OOP Objekt-orienterad programmering

Transkript:

Programsystemkonstruktion med C++ Övning 2 Daniel Aarno bishop@kth.se

Översikt övning 2 Klasser Konstruktorer Destruktorer Arv Virtuella funktioner Abstrakta klasser Operatorer Templateklasser Templatefunktioner Metaprogrammering Kodningstips Tentatal 2

#ifndef _MOVIE_RECORD_ #define _MOVIE_RECORD_ Klasser class MovieRecord { public: MovieRecord(); MovieRecord(const MovieRecord &mr); MovieRecord(std::string title, std::string director = "", int year = 0); ~MovieRecord(); operator=(const MovieRecord &mr); friend std::ostream& operator<<(const ostream &os, const MovieRecord &mr); protected: //< Not needed private: std::string m_title; std::string m_director; int m_year; ; #endif //_MOVIE_RECORD_ 3

Konstruktorer Minnesallokering automatiskt minne (stacken) dynamiskt minne (heapen) Initiering av medlemmar Styrs via initieringslista (kolonlista) OBS! Följande MÅSTE initieras via kolonlista const-deklarerade medlemmar referenser medlemsvariabler av en typ som saknar defaultkonstruktor Exekvering av kod i konstruktorn 4

Konstruktorer (cont'd) Följande konstruktorer skapas automatiskt Defaultkonstruktor (kör medlemmars defaultkonstruktor) Kopieringskonstruktor (kör medlemmars kopieringskonstruktor) Även kopieringsoperatorn (operator=) skapas automatiskt Kopierar elementvis 5

Konstruktorer (cont'd) #include <iostream> class A { public: std::string str; ; int main() { A a; std::cout << a.str << std::endl; a.str = "Hello"; std::cout << a.str << std::endl; A b(a); std::cout << b.str << std::endl; a.str += World ; b = a; std::cout << b.str << std::endl; 6

Destruktorer Kan bara finnas en destruktor Tar aldrig några argument Defaultdestruktor kör medlemmars destruktor Tänk på att göra delete och/eller delete[] på rätt sätt i destruktorn 7

Arv Animal name: std::string = +getname(): std::string Donkey Horse Mule http://pigseye.kennesaw.edu/~dbraun/ csis4650/a&d/uml_tutorial/ http://www.gnome.org/projects/dia/ 8

Arv (cont'd) Objekt Animal Donkey Mule Konstruktor Animal Animal Donkey Animal Donkey Animal Horse Mule Destruktor ~Animal ~Donkey ~Animal ~Mule ~Horse ~Animal ~Donkey ~Animal 9

Arv (cont'd) class BaseClass { OtherClass& m_ref; const int m_c; public: BaseClass(OtherClass& ref, int c) : m_ref(ref), m_c(c) {; // BaseClass(OtherClass& ref, int c) : // m_c(c), m_ref(ref) {; //< Warning! /*...*/ ; class SubClass: public BaseClass { public: SubClass(OtherClass& ref, int c=4711) : BaseClass(ref,c) {; // SubClass(OtherClass& ref, int c=4711) : // m_ref(ref), m_c(c) {; //< Error! /*...*/ ; 10

Virtuella funktioner class A { void foo() { cout << A::foo() << endl; virtual void bar() { cout << A::bar() << endl; ; class B : public A { void foo() { cout << B::foo() << endl; void bar() { cout << B::bar() << endl; ; int main() { B b, *bptr = &b; A *aptr = bptr; bptr >foo(); bptr >bar(); aptr >foo(); aptr >bar(); return 0; 11

Virtuella funktioner (cont'd) int main() { B b, *bptr = &b; A *aptr = bptr; bptr >foo(); bptr >bar(); aptr >foo(); aptr >bar(); return 0; >./a.out B::foo() B::bar() A::foo() B::bar() 12

Virtuella funktioner (cont'd) 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 A { void foo() { cout << A::foo() << endl; virtual void bar() { cout << A::bar() << endl; ; class B : public A { void foo() { cout << B::foo() << endl; void bar() { cout << B::bar() << endl; ; 13

Virtuella funktioner (cont'd) Class int m_id; std::string name;... v table {... *func1; *func2;... *funcn; V-table 14

Virtuella funktioner (cont'd) Virtuella destruktorer Vad är problemet med följande kod? class A { public: ~A(){ cout << "~A()" << endl; ; class B : public A { public: ~B(){cout << "~B()" << endl; ; int main() { A* a = new A(); A* b = new B(); delete a; delete b; 15

Virtuella funktioner (cont'd) Det går ej att skapa en instans av en 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: class A { public: virtual foo() = 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 (annars blir ju även subklassen abstrakt). 16

Virtuella funktioner (cont'd) C++ Virtual virtual void func(); Pure virtual virtual void func() = 0; Java Default void func(); Abstract abstract void func(); 17

Operatorer class Vec { int *m_elem; public: Vec(){m_elem = new int[10]; ~Vec() { delete[] m_elem; ; int main(){ Vec v1; Vec v2(v1); Vec v3; v3=v2; ; Vec::v1 m_elem Vec::v2 m_elem Vec::v3 m_elem Minne 18

Operatorer class Vec { int *m_elem; public: Vec(){m_elem = new int[10]; ~Vec() { delete[] m_elem; Vec::v1 m_elem Vec(const Vec& v) { m_elem = new int[10]; for(int i=0; i<10; i++) m_elem[i] = v.m_elem[i]; Vec::v2 m_elem Minne ; Vec& operator=(const Vec& v) { if(this!=&v){ delete[] m_elem; m_elem = new int[10]; for(int i=0; i<10; i++) m_elem[i] = v.m_elem[i]; return *this; Vec::v3 m_elem 19

Operatorer (cont'd) class Complex { float m_re; float m_im; public: Complex(float re = 0, float im = 0); Complex(const Complex &c); ~Complex(); Complex& operator=(const Complex &c); Complex& operator++(); //prefix Complex& operator++(int); //postfix Complex& operator (); //prefix Complex& operator (int); //postfix Complex& operator+=(const Complex &c); Complex& operator =(const Complex &c); Complex& operator*=(const Complex &c); bool operator==(const Complex &c) const; bool operator!=(const Complex &c) const; friend Complex operator+(const Complex &c1, const Complex &c2); friend Complex operator (const Complex &c1, const Complex &c2); friend ostream& operator<<(ostream &os, const Complex &c); ; 20

Templateklasser class Stack { private: int m_stk[stk_size]; int m_top; public: Stack() : m_top(0) {; bool isempty() { return (m_top == 0); bool isfull() { return (m_top >= STK_SIZE); bool push(int i) { if(isfull()) return false; m_stk[m_top++] = i; return true; bool pop(int &i) { if(isempty()) return false; i = m_stk[ m_top]; return true; ; 21

Templateklasser (cont'd) template <typename T> class Stack { private: T m_stk[stk_size]; int m_top; public: Stack() : m_top(0) {; bool isempty() { return (m_top == 0); bool isfull() { return (m_top >= STK_SIZE); bool push(const T &o) { if(isfull()) return false; m_stk[m_top++] = o; return true; bool pop(t &o) { if(isempty()) return false; o = m_stk[ m_top]; return true; ; 22

Templateklasser (cont'd) int main() { Stack<int> istk; //< Stack of ints Stack<double> fstk; //< Stack of doubles istk.push(4711); istk.push(47.11); //< Will be truncated to 47 (Warning) fstk.push(47.11); fstk.push(4711); //< Will be represented as (double)4711 return 0; 23

Templatefunktioner (cont'd) template<typename T> inline T max(const T &o1, const T &o2) { return o1 > o2? o1 : o2; template<> const char* max<char*>(const char* &o1, const char* &o2) { return strcmp(o1,o2) >= 0? o1 : o2; int main() { max(3,6); max(3.2, 0.3); //max(3, 3.2); //< Error max<double>(3, 3.2); //< OK max( Hejsan, Svejsan ); return 0; 24

Templatefunktioner (cont'd) Vid kompilering av templates måste alla templatefunktioner och klasser vara definierade innan de används. Detta medför att templatefunktioner och klasser oftast definieras i.h-filen. main.cpp #include Stack.h int main() { Stack<int> istk; //... return 0; > g++ main.cpp o stktst >./stktst Stack.cpp finns inte, implementation i.h-filen 25

Templatefunktioner (cont'd) Templates Återanvända kod (+) Statisk typkontroll (+) Effektiv implementering (+) Måste definieras innan användning (-) Långsam kompilering (-) Stor binärfil (-) Arv från Object (Java) Återanvända kod (+) Flexibelt (man kan t ex blanda objekt i en vektor) (+) Run-time typkontroll (-) Overhead pga V-table etc (-) Allt måste ärva från ett objekt (-) 26

Metaprogrammering template<int N> struct fact { enum{value=n*fact<n 1>::value; ; template<> struct fact<0> { enum{value=1; ; int main() { cout<< fact<3>::value << endl; return 0; 27

Kodningstips Var konsekvent Ge klasser, funktioner och publika medlemsvariabler beskrivande namn En klass, två filer (.h och.cpp) Undvik altför smart kod Indentera ordentligt Undvik one-line-ifs, använd { Undvik nästlade if/for satser Skriv inte för långa funktioner, dela upp 28

Kodningstips Förslag på namngivning Globala variabler: longvarname Medlemsvariabler: varnam Lokala variabler: tmp, i, cnt, f,... Konstanter: CONST_NAME Klasser: LongClassName Medlemsfunktioner: longfuncname Globala funktioner: LongFuncName Statiska medlemsfunktioner: LongFuncName 29