C++ • C++ als een verbetering van C • Abstracte datatypen met classes • Constructoren en destructoren • Subklassen • binding van functies 1.

Slides:



Advertisements
Verwante presentaties

Advertisements

PROS2 Les 13 Programmeren en Software Engineering 2.

Algoritmen en Datastructuren (ALDAT)
OOS Object geOrienteerd Software-ontwerp - 3
Instructie Programmeren Task 8 5JJ70. PAGE 2 Task 8: Double Linked List Het doel van deze opdracht is: Het opbouwen van een tweetal klassen, die samen.
Van domeinklasse tot implementatie
PROS2 Les 11 Programmeren en Software Engineering 2.
GESPRG Les 14 Gestructureerd programmeren in C. 174 Details! The devil is in the details.
1 Tentamen 21 januari 2008 uitleg Algemene kennisvragen a)“Wat verstaan we onder de complexiteit van een algoritme?” –Cruciaal: wat gebeurt er met.
Hoofdstuk 2 Hallo, C# !.
MICPRG Les 11 Microcontroller Programmeren in C. 112 Datastructuren in C Werkgeheugen (PC en microcontroller): Statische datastructuren (vaste grootte):
GESPRG Les 7 Gestructureerd programmeren in C. 92 Verwisselen Schrijf een functie waarmee twee int variabelen verwisseld kunnen worden. void wissel(int.
Hoofdstuk 8 Objecten en klassen.
Static Keyword static voor functieleden functie niet voor een object aangeroepen class K {... static int minimum( int i, int j); } aanroep: K::minimum(
JAVA -- H51 CONSTRUCTOR –- COPY-CONSTRUCTOR 1Constructor: Dezelfde naam als de klasse Wordt uitgevoerd d.m.v. new Initialisatie van de (private) attributen.
Algoritmiek Object-georiënteerd Programmeren
1 Datastructuren Introductie tot de programmeeropgaven in C++ Jan van Rijn
Vakgroep Informatietechnologie – SoftwareOntwikkeling 1 SoftwareOntwikkeling 1 Conditionele compilatie in C met de macropreprocessor.
Deel I: Programmeertaal C 6. Arrays en Pointers
P. 1 Vakgroep Informatietechnologie Structuur Deel II C++ Classes Namespaces Type casting Reference types Constructors en Destructors Memory Management.
P. 1 Deel I: Programmeertaal C 4. Functies en Macro’s Prof.Dr.Ir. Filip De Turck.
Looking at Code Size and Performance Kevin Muys.  Hoe efficiënt is C++ vergeleken met C  Hoe beïnvloed C++ het benodigde geheugen  Oplossingen voor.
C++ C++ als een verbetering van C Abstracte datatypen met classes Constructoren en destructoren Subklassen binding van functies 1.
Constructoren Genesis 1:1 Aarde a1 = new Aarde(“Adam”, “Eva”);
Animatie nAnimatie: “tekenfilm” programma toont automatisch veranderende beelden nGemakkelijk te programmeren met gebruik van de klasse Thread “draadje”
Tircms02-p les 3 Functies Strings Structuren. Functies 1. main() 2. { int k; k = 10 ; printf(“%d\n”,fac(k)); } 3. int fac(n) int n; 4. { int f; f= 1;
Tircms02-p les 2 Meer operatoren Arrays en pointers Types en conversie.
Tircms03-p les 4 Klassen. Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1; } void push(stack *s,
Scope. Scope van variaben/methoden Een variabele is te gebruiken binnen de { en } waarbinnen hij is aangemaakt. Hetzelfde geld voor een methode { int.
Polymorphisme en Interfaces: inleiding
Hoofdstuk 3 Methoden om te tekenen.
Java C++ nVeilig nMachine- onafhankelijk nVeel libraries, ook voor Internet-I/O Snel Native executables Libraries optimaal voor specifiek OS.
Java Objectgeoriënteerd Programmeren in Java met BlueJ
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 7 Polymorfie en overerving © 2014, Gertjan Laan, versie 2.
De laatste essentiele dingen.  Classes ◦ Syntax ◦ Constructors & Destructors  Header & Source Files ◦ Waar gebruiken we dit voor  Compiler Theorie.
Studiehouding Ergens verstand van krijgen kost tijd… Uren die je alleen in je boeken doorbrengt maken het verschil. Er is niets mis met onafhankelijkheid.
 C++ heeft een inheritance mechanisme  Manier om functionaliteit te ‘erfen’ van een parrent class ◦ Polymorphisme ◦ Zoals we het ook in C# kennen.
Programma opdrachten methoden klasse variabelen en Geheugen objecten klasse zijn gegroepeerd in hebben als type veranderen bewerken.
Aangepaste timing nTheorie (16 colleges + 2 deeltentamens) nPraktijk (16 keer, 3 inleveropdrachten) college Tent. 1 Tent. 3 college prakt. 1 prakt. 3 prakt.
Herhaling: He who does not learn from history, is doomed to repeat it.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
De definitie van een object. Een object is een verzameling van eigenschappen en bewerkingen. Veel voorkomende objecten zijn: D (display) Gui (user interface)
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Game Object Structuren
Objectgeoriënteerd Programmeren (2)
Objectgeoriënteerd Programmeren
Gameprogrammeren: Objecten en geheugen
Gameprogrammeren: Lists en interfaces
Gameprogrammeren: Overerving
Hoofdstuk 9.2 Strings.
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Gameprogrammeren: Methoden
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Overerving in Painter
Basis Gameprogrammeren
Tinpro015b-les3 Hfdst 3,4 Meer operatoren Functies.
Tinpro015b-les6 Templates.
Syntax van opdracht opdracht naam naam ( expressie ) ; . , expressie
Arjan Egges & Paul Bergervoet
Tinpro015b-les4 Klassen.
Voorbeeld: Simulatie van bewegende deeltjes
Voortborduren op eerder gedaan werk
Arjan Egges Paul Bergervoet Wouter van Toll
Unified Modeling Language
Gameprogrammeren: Klassen en objecten
Arjan Egges & Paul Bergervoet
Object Communication (Jewel Jam)
Software Development fundamentals
Gameprogrammeren: Arrays
Transcript van de presentatie:

C++ • C++ als een verbetering van C • Abstracte datatypen met classes • Constructoren en destructoren • Subklassen • binding van functies 1

Commentaar In C: /* Deze functie berekent de omtrek van een cirkel */ float omtrek(float r) { /* r is de straal */ return (2*pi*r); } In C++: // Deze functie berekent // de omtrek van een cirkel { // r is de straal } 2

Vermijd #define In C: #define pi 3 Vermijd #define In C: #define pi 3.14159 #define false 0 #define als if In C++: const float pi = 3.14159; const int false = 0; const int *pf = &false; Ander gebruik van const: char *const s = "hallo"; 3

Vermijd #define In C: #define sq(x) x*x sq(1+2) Lapmiddel: functie-syntax: inline int sq(int x) { return x*x; } 4

Declaraties In C: aan het begin van een functie In ANSI-C: aan het begin van een blok In C++: overal in het blok (dichtbij het gebruik) 5

Typedeclaraties In C: struct punt { int x,int y; } void f(struct punt p); Lapmiddel: typedef struct punt { int x, int y; } PUNT; void f(PUNT p); In C++: struct punt { int x, int y; } void f(punt p); 6

Call by reference In C: void wissel( int *x, int *y) { int h; h = *x; *x = y; *y = h; } main() { int a, b; wissel( &a, &b ); } In C++: void wissel( int &x, int &y) { int h; h = x; x = y; y = h; } { int a, b; wissel( a, b ); } 7

Overloading In C: int iabs(int x) { return (x<0 ? -x : x); } float fabs(float x) { return (x<0.0 ? -x : x); } main() { ... iabs(3) + fabs(-2.7) ...} In C++: int abs(int x) float abs(float x) { return (x<0.0 ? -x : x);} { ... abs(3) + abs(-2.7) ...} 8

Default-parameters Overloading is handig: float macht(float x, int n) for (i=0; i<n; i++) r *= x; return r; } float macht(float x) { return macht(x,2); Maar nog handiger is: float macht(float x, int n=2) r *= x; return r;} 9

Dynamische allocatie In C: int *data; data = (int*) malloc( n * sizeof(int) ); f(data[4]); free(data); In C++: data = new int[n]; delete data; 10

Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1;} void push(stack *s, char c) { s->top++; s->info[s->top] = c; } char top(stack *s) { return s->info[s->top]; } main() { struct stack s; /* bedoeld gebruik */ reset(s); push(s,’a’); /* onbedoeld gebruik */ s.info[73] = ’x’; } 11

Abstracte datatypes in C++ struct stack { private: char info[100]; int top; public: void reset(void) { top = -1; } void push(char c){ top++; info[top]=c; } char top(void) { return info[top]; } }; main() { stack s; s.reset(); s.push(’a’); } 12

structs in C++ Bevatten naast data ook functies (memberfuncties) Declaraties zijn • private: alleen door memberfuncties te gebruiken • public: bereikbaar met punt-notatie Implementatie: private/public beınvloedt alleen scope memberfuncties worden niet echt opgeslagen memberfuncties hebben stiekem extra parameter 13

classes in C++ Verschil alleen in default-protectie: • in een struct declaraties zijn default public • in een class declaraties zijn default private class stack { char info[100]; int top; public: void reset(void) { top = -1; } void push(char c){ top++; info[top]=c; } char top(void) { return info[top]; } }; 14

Object-georienteerd programmeren Instances van classes heten objecten. Imperatief programmeren: Functies (met objecten als parameter) Object-georienteerd programmeren: Objecten (met functies als member) Echt object-georieenteerd wordt het pas bij dynamische binding van memberfuncties. 15

Declaratie van memberfuncties Direct in de klasse-declaratie: class c { int x; public: int f(void) { return 2*x; } }; In de klasse-declaratie alleen prototype, functiedeclaratie apart: int f(void); }; int c::f(void) { return 2*x; } Notatie c::f heet scope-resolutie 16

static variabelen in C static lokale variabelen van functies worden gedeeld door alle aanroepen void f(void) { static int n=0; printf("ik ben %d keer\ aangeroepen", n++); } Implementatie: globale variabele met beperkte scope 17

static members in C++ static members van classes worden gedeeld door alle instanties class c { static int n; int x; int y; public: void f() { n++; } void g() { n++; } void h() { printf ("%d keer memberfuncie\gebruikt", n); } }; Implementatie alweer: globale variabele met beperkte scope 18

Constructors Initialisatie van een instance van een klasse door constructor functie. Heeft dezelfde naam als de klasse, en geen resultaattype class stack { char info[100]; int top; public: stack(void) { top = -1; } }; Constructorfunctie wordt automatisch aangeroepen bij creatie van de variabele main() { stack s, *p; ... p = new stack; } 19

Constructors met parameters Handig voor initialisatie Parameters worden meegegeven bij declaratie of dynamische creatie class punt { int x; int y; public: punt(int x0, int y0) { x=x0; y=y0; } }; main() { punt hier(12,5), *p; ... p = new punt(2,6); } 20

Dynamisch geheugen als members Allocatie in constructorfunctie De-allocatie in destructorfunctie class stack { char *info; int top; public: stack(int n) { info = new char[n]; top = -1; } ~stack(void) { delete info;} }; Destructor wordt automatisch aangeroepen als het object verdwijnt 21

Classes voor open/sluit-constructies In C: File f; f = open("aap"); seek(f,pos); read(f,data); close(f); Met classes in C++: { File f("aap"); f.seek(pos); f.read(data); } 22

Nog een open/sluit-constructie In C: data = GlobalLock(handle); ... data->x ... GlobalUnlock(handle); Met classes in C++ zou dit zo kunnen: { Lock data(handle) ... data.x ... } met in de constructor GlobalLock en in de destructor GlobalUnlock 23

Toepassing: veilige arrays class Vector { int *p; int size; public: Vector(int n=10) { size=n; p=new int[n]; } ~Vector(void) { delete p; } int &elem(int); }; int & Vector::elem(int i) { if (i<0 || i>=size) printf("bound error"); return p[i]; } main() { Vector a(10), b(5); a.elem(1) = 17; b.elem(1) = a.elem(1) + 9; } 24

Members die zelf objecten zijn Probleem: class Twee { Vector heen; Vector terug; public: Twee(int i) { } }; Wat is de parameter van de constructoren van de members? Oplossing: speciale syntax hiervoor: Twee(int i) : heen(i), terug(i) { } 25

Pointer naar this object class klasse; void f(klasse *obj); Pointer naar object is impliciete parameter van member-functies: class klasse { int x; public: void g(void); void h(void) { // impliciete parameter gebruikt voor toegang tot andere members ... x ... ... g() ... // moet expliciet genoemd om ‘dit’ object door te geven aan externe functies ... f(this) ... } }; 26

classes Derived classes breiden een klasse uit met extra members. Memberfuncties mag je herdefinieren. class Persoon { public: char naam[20]; int gebJaar; int leeftijd(void); void print(void); }; class Student : Persoon char studie[10]; main() { Student s; ... s.naam ... ... s.studie ... s.print(); } 27

Constructoren voor derived classes Voorbeeld: array met ondergrens class Vector { public: Vector(int); ~Vector(void) int &elem(int); }; class BndVector : Vector { int eerste; BndVector(int lo, int hi) : Vector(hi-lo) { eerste = lo; } int &elem(int i) { return Vector::elem(i-eerste); } }; 28

Binding van hergedefinieerde functies Binding van functies gebeurt statisch, dus op grond van het compile-time type: class A { public: int f(void){ return 1; } }; class B : A int f(void){ return 2; } main() { A a; B b; a.f(); // levert 1 b.f(); // levert 2 } 29

Derived klassen zijn subtypen Binding blijft statisch main() { A a, *pa; B b; pa = &a; // dit mag pa->f(); // levert 1 pa = &b; // dit mag ook! pa->f(); // wat levert dit? } 30

virtual functies Dynamische binding van member-functies kan met virtual functies: class A { public: virtual int f(void){ return 1; } }; class B : A int f(void){ return 2; } // type moet hetzelfde zijn als A::f }; main() { A a, *pa; B b; pa = &a; pa->f(); // levert 1 pa = &b; pa->f(); // levert nu 2! } 31

Implementatie van virtual Memberfuncties die virtual zijn, worden wel in de datastructuur opgeslagen. Bij creatie is het type, en dus de gewenste functie bekend. Bij aanroep wordt de gewenste functie in de datastructuur opgezocht. Kost iets meer tijd en ruimte, maar voor de programmeur erg makkelijk. 32