Upload
abril
View
40
Download
0
Embed Size (px)
DESCRIPTION
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). - PowerPoint PPT Presentation
Citation preview
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 1
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
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 2
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öperEn klass är en datatyp!
(Nytt - Stroustrup 4.2)
(Repetera C:s, Stroustrup 4)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 3
Operatorer, nyckelord
+ - * / % (remainder)
< <= == != >= > && || != ++ -- += -= etc. ? : sizeof ,:: . -> [] () new delete& | ~ ^ << >> &= |= ^=Reserverade nyckelord se tabell i boken s.924
(Repetera C:s, Stroustrup 6.2 t.o.m. 6.2.5)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 4
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)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 5
Explicit typkonverteringvariabel = static_cast<önskadtyp>(uttryck)På samma sätt:dynamic_castconst_castreinterpret_cast
Använd inte C- skrivsättet: önskadtyp(uttryck) eller (önskadtyp)uttryck
(Stroustrup 6.2.7)(Mer om dynamic_cast senare)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 6
Namespacesnamespace my_namespace { class dog { osv }}my_namespace::dog
using namespace my_namespace;dognamespace my_ns my_namespace;
diskontinuerligt
nästade
(Stroustrup 3.3, 8.1-8.2)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 7
iostream library
#include <iostream>int mittTal;cout << ”Gissa ett heltal” << endl;cin >> mittTal;cerr << ”Det var fel!” << endl;
(Stroustrup 3.2, 3.4, 3.6)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 8
I/O mot filer#include <fstream> // iostream på köpetstring 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. 21.5.2)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 9
Klassen string// Smartare än char * !#include <string>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)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 10
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)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 11
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)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 12
Mer pekare
minTyp* pMinTyp = new minTyp[bufstorl];
pMinTyp++;
pekare till funktion
(Stroustrup 5.3)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 13
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
pekareobjA
objB
!
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 14
<vector>// Smartare än array#include <vector>vector<int> minHeltalsVektor(100);// Nu använder vi en klassmalldinVektor = 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)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 15
Funktioner i C++Som i C men fler valmöjligheter beträffande
parameteröverföringen:void move(int steps); // lokal kopia på stackenvoid 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.1-7.3, 7.5-7.6, 7.9)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 16
Lurigt?
int evaluate(HugeObj &hObj);myValue = evaluate(myHugeObj);
int evaluate(HugeObj *hObj);myValue = evaluate(&myHugeObj);
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 17
Ö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)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 18
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
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 19
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 7.8.1För den som vill läsa mer)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 20
Funktionsmallar
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
(Stroustrup 13.3)(mer om mallar senare)
2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT
Sid 21
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?