Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT 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
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Datatyper (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) (Repetera C:s, Stroustrup 4)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Operatorer, nyckelord + - * / % (remainder) = > && || ! = = -= etc. ? : sizeof, ::. -> [] () new delete & | ~ ^ > &= |= ^= Reserverade nyckelord se tabell i boken s.924 (Repetera C:s, Stroustrup 6.2 t.o.m )
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Implicit typkonvertering 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. (Som i C)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Explicit typkonvertering variabel = static_cast (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)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Namespaces namespace my_namespace { class dog { osv } } my_namespace::dog using namespace my_namespace; dog namespace my_ns my_namespace; diskontinuerligt nästade (Stroustrup 3.3, )
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT iostream library #include int mittTal; cout << ”Gissa ett heltal” << endl; cin >> mittTal; cerr << ”Det var fel!” << endl; (Stroustrup 3.2, 3.4, 3.6)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT I/O mot filer #include // 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; (Stroustrup 21.5 t.o.m )
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Klassen string // Smartare än char * ! #include string myString(“Vi testar string”); const string tomStr; if ( ! yourString.size()) if (yourString.empty()) if (myString == yourString) cin >> myString (Stroustrup 3.5) (20 för den som vill läsa mer)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Referenser ”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? (Stroustrup 5.5)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT dynamisk minnesallokering pekare, new och delete 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) (Stroustrup 5.1, 5.6)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Mer pekare minTyp* pMinTyp = new minTyp[bufstorl]; pMinTyp++; pekare till funktion (Stroustrup 5.3)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT 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 objA objB !
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT // Smartare än array #include vector minHeltalsVektor(100); // Nu använder vi en klassmall dinVektor = minVektor; if (dinVektor.empty()) while (cin >> word) minVektor.push_back(word); (Stroustrup 3.7.1) (3.7.2 för den som vill läsa mer)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Funktioner i C++ 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 (Stroustrup , , 7.9)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Lurigt? int evaluate(HugeObj &hObj); myValue = evaluate(myHugeObj); int evaluate(HugeObj *hObj); myValue = evaluate(&myHugeObj);
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av funktioner 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, (Stroustrup 7.4)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT 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; // - “ - Det räcker inte att returvärdets typ eller parametrarnas namn skiljer Vad händer? scope
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT inline inline void move(graph& g, int x, int y) { /* kod som ska kommas åt snabbt */ } (inga fula makron här inte) (Stroustrup 7.1.1) (7.8 till exklusive För den som vill läsa mer)
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Funktionsmallar template <class MyFirstType, typename MySecondType, int size> MyFirstType compute(MySecondType x) { MyFirstType y;... if (x...)...y =... return y; } float myStartValue = ; int result = compute(myStartValue ); // instantiering (Stroustrup 13.3) (mer om mallar senare)
Sid period2CD5250 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?