220 likes | 386 Views
CD5250. OOP med C++. Lektionsmål. Efter avslutad föreläsning bör vi begripa hur man använder: Minnesallokering Defaulta värden på argument Funktionsöverlagring Mallar (Templates) Namespaces C++ Standardbibliotek <iostream> och <fstream> String och vector. Kommentar och Scope.
E N D
CD5250 OOP med C++ CD5250 OOP med C++ Daniel Flemström MDH/IDT
Lektionsmål Efter avslutad föreläsning bör vi begripa hur man använder: • Minnesallokering • Defaulta värden på argument • Funktionsöverlagring • Mallar (Templates) • Namespaces • C++ Standardbibliotek<iostream> och <fstream> • String och vector CD5250 OOP med C++ Daniel Flemström MDH/IDT
Kommentar och Scope • Kan allt som C kan, och mer därtill. C C++ /* Kommentar*/ #define BUFSIZE 12{ int a,b,c; ... ... a = b + c; } // Kommentar constint BUFSIZE=12;{ ... ... int a,b,c; a = b + c; } CD5250 OOP med C++ Daniel Flemström MDH/IDT
Datatyper, true,false • Nya datatyper. C C++ bool b = true; class kalle {int age; void SetAge(int val) {age = val;} }; #define TRUE –1 #define FALSE 0struct kalle { int age; };void SetAge(int val, struct kalle* s,){s->age = val;} CD5250 OOP med C++ Daniel Flemström MDH/IDT
Minneshantering • C++ har en uppsnyggad minneshantering C C++ enstaka element arrayer malloc / free malloc / free new / delete new[] / delete[] int* i = newint[200]; delete[] i; CD5250 OOP med C++ Daniel Flemström MDH/IDT
Lite pekarrepetition int* pArrayen = newint[6]; 9 pArrayen *pArrayen 5 pArrayen[1] 9 &pArrayen 5 CD5250 OOP med C++ Daniel Flemström MDH/IDT
Faror med pekare ! objA objB • Om i något läge avallokering missas • “minnesläcka” • Pekare till objekt(tex array) som inte finns längre • Delete av samma objekt två ggr via olika pekare CD5250 OOP med C++ Daniel Flemström MDH/IDT
Referenser • C++ har pekare men dessutom referenser C C++ void reset(int& a) { a = 0; } void main () {int b = 12; reset(b);} void reset(int* a) { *a = 0; } void main () {int b = 12; reset(&b);} CD5250 OOP med C++ Daniel Flemström MDH/IDT
Mer Om Referenser ”Som pekare men lättare att använda.” Används mest för parameteröverföring. int mittTal = 3; int &refTillMittTal = mittTal; /* jämför med nedan:*/ int *pTillMittTal = &mittTal; refTillMittTal = 4; // vad händer? CD5250 OOP med C++ Daniel Flemström MDH/IDT
Annat sätt att se referenser 0x0FA a,b = 7 0x0FB C =0x0FA 0x0FC 0x0FD inta = 7; int& b = a; int* c = &a; int d = *c; // Men vad blir detta??? CD5250 OOP med C++ Daniel Flemström MDH/IDT
Overloading • C++ har funktionslagring (overloading) C C++ void print(int a); void print(float a); void print(char* a); void printInt(int a); void printFloat(float a); void printString(char* a); CD5250 OOP med C++ Daniel Flemström MDH/IDT
Overloading, exempel void move(int x, int y); void move(int angle, int length); typedefint angle;//Hjälper det? classAngle; // - “ - Vad händer? Det räcker inte att returvärdets typ eller parametrarnas namn skiljer CD5250 OOP med C++ Daniel Flemström MDH/IDT
Default arguments • C++ kan ha defaulta värden på argument C C++ void print(int a, char sep = ’b’); void main() { print (12,’b’); print (12);} void print(int a, char sep); void main() { print (12,’b’); print (12);} CD5250 OOP med C++ Daniel Flemström MDH/IDT
Templates • C++ har templates (mallar med typkontroll) C C++ template<typename T> void myRESET(T& a) {a = 0;} void main () { int o = 12; myRESET<int>(o); float f = 12.3; myRESET<float>(f); } #define myRESET(a)\ a = 0 void main () { int o = 12; myRESET(o); float f = 12.3; myRESET(f); } CD5250 OOP med C++ Daniel Flemström MDH/IDT
Inline • C++ har inline funktioner • C C++ inline int MAX(int a,int b) { if (a > b) return a; else return b; } #define MAX(a,b)\ ((a)>(b))?(a):(b) CD5250 OOP med C++ Daniel Flemström MDH/IDT
Namespaces namespace my_namespace { class dog { osv } } my_namespace::dog usingnamespace my_namespace; dog namespace my_ns my_namespace; diskontinuerligt nästade CD5250 OOP med C++ Daniel Flemström MDH/IDT
Egna Namespaces • För att skapa ett eget namespace att lägga klasser i använder man nyckelordet namespace • Standardutseende namespace jms{ class Matrix { returtyp metod(parametrar…); ... };} CD5250 OOP med C++ Daniel Flemström MDH/IDT
Egna Namespaces • 3 olika sätt att komma åt klassen Matrix • jms::Matrix matrix; • Använder uttryckligen en klass i ett specifikt namespace • using namespace jms;Matrix matrix; • Använder hela jms namespace (risk för kollisioner) • using jms::Matrix;Matrix matrix; • Använder endast en delmängd av jms namespace (Matrix) CD5250 OOP med C++ Daniel Flemström MDH/IDT
iostream library #include <iostream> using namespace std; void main () { int mittTal; cout << ”Gissa ett heltal” << endl; cin >> mittTal; . . . cerr << ”Nåt gick snett!” << endl; . . . } CD5250 OOP med C++ Daniel Flemström MDH/IDT
iostream library II #include <iostream> #include <string> using namespace std; void main () { stringmittNamn; cout << ”Skriv ett namn” << endl; cin >> mittNamn; . . . } CD5250 OOP med C++ Daniel Flemström MDH/IDT
I/O mot filer #include <fstream> usingnamespace std; void main () { ofstream outFile(”Kalle.TXT”); if (outFile){ outFile << ”text” << endl; } }// end main CD5250 OOP med C++ Daniel Flemström MDH/IDT
Enkel felhantering - assert() #include <cassert> using namespace std; inline void checkRange(int index) { assert (index >= 0 && index < size); } ouppfyllt villkor skrivs ut och programmet avlsutas omedelbart. CD5250 OOP med C++ Daniel Flemström MDH/IDT