210 likes | 344 Views
C++ - förbättrat C?. Procedurellt program ser ut som C: sekvens, selektion, iteration /* kommentar */ och // Kommentar const int bufsiz = 512 (”inte #define”) {Block}, block-scope, initiering Deklarera före användning – i minsta möjliga scope. Datatyper. (Repetera C:s, Stroustrup 4).
E N D
C++ - förbättrat C? • Procedurellt program ser ut som C: sekvens, selektion, iteration • /* kommentar */ och // Kommentar • const int bufsiz = 512 (”inte #define”) • {Block}, block-scope, initiering • Deklarera före användning – i minsta möjliga scope CD5250 OOP med C++ Mats Medin MDH/IDT
Datatyper (Repetera C:s, Stroustrup 4) • (signed/unsigned) char short int long, float double - som i C • bool • klasser i C++ standard library (exempel!) • även fördefinierade klassmallar • klasser man definierar själv eller köper En klass är en datatyp! (Nytt - Stroustrup 4.2) CD5250 OOP med C++ Mats Medin MDH/IDT
Operatorer, nyckelord (Repetera C:s, Stroustrup 6.2 t.o.m. 6.2.5) + - * / % (remainder) < <= == != >= > && || ! = ++ -- += -= etc. ? : sizeof , :: . -> [] () new delete & | ~ ^ << >> &= |= ^= Reserverade nyckelord se tabell i boken s.924 CD5250 OOP med C++ Mats Medin MDH/IDT
Implicit typkonvertering (Som i C) • aritmetiskt uttryck innehållande olika typer: till den typ som är störst (har flest databitar) • tilldelning av uttryck av en typ till objekt av annan typ. • uttryck av en typ används som parameter till funktion vars formella parameter har annan typ. • funktions returvärde tilldelas uttryck av annan typ än den som definierats för det. CD5250 OOP med C++ Mats Medin MDH/IDT
Explicit typkonvertering variabel = static_cast<önskadtyp>(uttryck) På samma sätt: dynamic_cast const_cast reinterpret_cast Använd inte C- skrivsättet: önskadtyp(uttryck) eller (önskadtyp)uttryck (Stroustrup 6.2.7) (Mer om dynamic_cast senare) CD5250 OOP med C++ Mats Medin MDH/IDT
Namespaces (Stroustrup 3.3, 8.1-8.2) namespace my_namespace { class dog { osv } } my_namespace::dog using namespace my_namespace; dog namespace my_ns my_namespace; diskontinuerligt nästade CD5250 OOP med C++ Mats Medin MDH/IDT
iostream library (Stroustrup 3.2, 3.4, 3.6) #include <iostream> int mittTal; cout << ”Gissa ett heltal” << endl; cin >> mittTal; cerr << ”Det var fel!” << endl; CD5250 OOP med C++ Mats Medin MDH/IDT
I/O mot filer (Stroustrup 21.5 t.o.m. 21.5.2) #include <fstream> // iostream på köpet string filnamn; cout << ”Vilken fil ska öppnas?: ” << endl; cin >> filnamn; ifstream infile(filnamn); if (!infile) cerr << filnamn << ” gick inte att öppna ” << endl; CD5250 OOP med C++ Mats Medin MDH/IDT
Klassen string (Stroustrup 3.5) (20 för den som vill läsa mer) // Smartare än char * ! #include <string> string myString(“Vi testar string”); const string tomStr; if ( ! yourString.size()) if (yourString.empty()) if (myString == yourString) cin >> myString CD5250 OOP med C++ Mats Medin MDH/IDT
Referenser (Stroustrup 5.5) ”Som pekare men lättare att använda.” Används mest för parameteröverföring. int mittTal = 3; // lyckotal? int &refTillMittTal = mittTal; /* jfr */ int *pTillMittTal = &mittTal; refTillMittTal += 4; // vad händer? refTillMittTal = ettAnnatTal; // vad händer? CD5250 OOP med C++ Mats Medin MDH/IDT
dynamisk minnesallokering pekare, new och delete (Stroustrup 5.1, 5.6) int * heltalsP = new int(13); int *heltalsP2 = new int[10]; delete heltalsP; delete[] heltalsP2; int* p eller int *p??? void * p Använd 0 (inte NULL) CD5250 OOP med C++ Mats Medin MDH/IDT
Mer pekare (Stroustrup 5.3) minTyp* pMinTyp = new minTyp[bufstorl]; pMinTyp++; pekare till funktion CD5250 OOP med C++ Mats Medin MDH/IDT
! objA objB Faror med pekare • Om i något läge avallokering missas • “minnesläcka” • Pekare till objekt som inte finns längre • Delete av samma objekt 2 ggr via olika pekare CD5250 OOP med C++ Mats Medin MDH/IDT
<vector> (Stroustrup 3.7.1) (3.7.2 för den som vill läsa mer) // Smartare än array #include <vector> vector<int> minHeltalsVektor(100); // Nu använder vi en klassmall dinVektor = minVektor; if (dinVektor.empty()) while (cin >> word) minVektor.push_back(word); CD5250 OOP med C++ Mats Medin MDH/IDT
Funktioner i C++ (Stroustrup 7.1-7.3, 7.5-7.6, 7.9) Som i C men fler valmöjligheter beträffande parameteröverföringen: void move(int steps); // lokal kopia på stacken void send(char *buffer); void swap(int &v1, int &v2); bool isEqual(const int& v1, const int& v2); void send(char * buffer, protocol p = defaultProtocol); void send(char *buffer,...); // suspend typechecking CD5250 OOP med C++ Mats Medin MDH/IDT
Lurigt? int evaluate(HugeObj &hObj); myValue = evaluate(myHugeObj); int evaluate(HugeObj *hObj); myValue = evaluate(&myHugeObj); CD5250 OOP med C++ Mats Medin MDH/IDT
void print(int x); void print(float f); int add(int x, int y); float add(float x, float y); print(add(int1, int2)); print(add(float1, float2)); Jämför: printInt(addInt(int1, int2)); printFloat(addFloat (float1, float2)); printChar, printBool, printString, Överlagring av funktioner (Stroustrup 7.4) CD5250 OOP med C++ Mats Medin MDH/IDT
scope Lurigt? void move(graph& g, int x, int y); void move(graph& g, int angle, int length); typedef int angle; //Hjälper det? class Angle; // - “ - Vad händer? Det räcker inte att returvärdets typ eller parametrarnas namn skiljer CD5250 OOP med C++ Mats Medin MDH/IDT
inline (Stroustrup 7.1.1) (7.8 till exklusive 7.8.1 För den som vill läsa mer) inline void move(graph& g, int x, int y) { /* kod som ska kommas åt snabbt */ } (inga fula makron här inte) CD5250 OOP med C++ Mats Medin MDH/IDT
Funktionsmallar (Stroustrup 13.3) (mer om mallar senare) template <class MyFirstType, typename MySecondType, int size> MyFirstType compute(MySecondType x) { MyFirstType y; ... if (x...) ...y = ... return y; } float myStartValue = 3.141592; int result = compute(myStartValue ); // instantiering CD5250 OOP med C++ Mats Medin MDH/IDT
Lurigt • Funkar mallen för alla typer som kan komma att användas med den? • Kan typerna/värdena bestämmas då mallen används? CD5250 OOP med C++ Mats Medin MDH/IDT