21
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

C++ - förbättrat C?

  • 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

Page 1: C++ - förbättrat C?

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

Page 2: C++ - förbättrat C?

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)

Page 3: C++ - förbättrat C?

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)

Page 4: C++ - förbättrat C?

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)

Page 5: C++ - förbättrat 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)

Page 6: C++ - förbättrat C?

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)

Page 7: C++ - förbättrat C?

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)

Page 8: C++ - förbättrat C?

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)

Page 9: C++ - förbättrat C?

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)

Page 10: C++ - förbättrat C?

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)

Page 11: C++ - förbättrat C?

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)

Page 12: C++ - förbättrat C?

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)

Page 13: C++ - förbättrat C?

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

!

Page 14: C++ - förbättrat C?

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)

Page 15: C++ - förbättrat C?

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)

Page 16: C++ - förbättrat C?

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);

Page 17: C++ - förbättrat C?

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)

Page 18: C++ - förbättrat C?

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

Page 19: C++ - förbättrat C?

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)

Page 20: C++ - förbättrat C?

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)

Page 21: C++ - förbättrat C?

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?