2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursassistent: Mårten Björkman,

Relevanta dokument
2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

C++-programmets beståndsdelar

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Det finns många flaggor till g++,

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Klassdeklaration. Metoddeklaration. Parameteröverföring

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

TDIU01 - Programmering i C++, grundkurs

grundläggande C++, funktioner m.m.

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

allokeras på stacken dynamiskt new delete

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TDIU01 Programmering i C++

TDIU01 - Programmering i C++, grundkurs

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Tommy Färnqvist, IDA, Linköpings universitet

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Programmering A. Johan Eliasson

Enkla datatyper minne

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Innehåll. Pekare Exempel

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Parameteröverföring. Exempel. Exempel. Metodkropp

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Programmering B med Visual C

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Innehåll. Pekare Exempel

Tillämpad programmering

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

F4. programmeringsteknik och Matlab

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Programsystemkonstruktion med C++

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 2 september 2006

Objektorienterad Programmering (TDDC77)

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Att använda pekare i. C-kod

Introduktion C-programmering

TDIU01 - Programmering i C++, grundkurs

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

C++ - En introduktion

Repetition C-programmering

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

TDIU01 - Programmering i C++, grundkurs

TDDC76 - Programmering och Datastrukturer

Objektorienterad programmering

Övning från förra gången: readword

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

Programsystemkonstruktion med C++

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Imperativ programmering. Föreläsning 2

2D1387, Programsystemkonstruktion med C++ 01/02 1

Föreläsning 3-4 Innehåll

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Programmeringsteknik med C och Matlab

Classes och Interfaces, Objects och References, Initialization

C++ - En introduktion

Tentamen OOP

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Transkript:

2D1387, Programsystemkonstruktion med C++ 01/02 1 Slide 1 2D1387, Programsystemkonstruktion med C++ Johnny Bigert, johnny@nada.kth.se Kursassistent: Mårten Björkman, celle@nada.kth.se Kursens hemsida: http://www.nada.kth.se/kurser/kth/2d1387 Varför vill man lära sig C++? Objektorienterat Har många intressanta tekniker, som t.ex. mallar (templates) Slide 2 Utökning från C med motto "det du inte använder betalar du inte för" Snabbt C++ används för beräkningsintensiva system i näringslivet Använt och testat sedan 1984, många verktyg

2D1387, Programsystemkonstruktion med C++ 01/02 2 Kursens mål Ni kommer att: få se hela språket, dvs alla nyckelord (keywords) och tekniker få prova de esta delarna, och använda de viktigaste itigt Slide 3 få erfarenhet av felmeddelanden från kompilatorn (man spar mycket tid när man förstår kompilatorns felmeddelanden) få erfarenhet av felmeddelanden från länkaren få använda avlusare såsom DDD (gra skt gränssnitt för gdb) få programmera mycket C++ Kursens mål i en mening: att eleven efter genomförd kurs ska ha kunskaper om programmeringspråket C++ och de tekniker språket tillhandahåller Kursen i stort Visar hela språket Mycket att lära på kort tid ger mycket labbtid och självstudier Åtta föreläsningar på totalt 16 timmar Slide 4 Tolv labbtillfällen på totalt 24 timmar Tre övningstillfällen på totalt 6 timmar Två labbar och en projektuppgift uppskattad tidsåtgång: 15 + 30 + 65 = 110 timmar (i genomsnitt) Nada ger inte rena språkkurser; C++ är ett undantag pga dess spridning och kraftfullhet.

2D1387, Programsystemkonstruktion med C++ 01/02 3 Examination För att examineras krävs att man godkänt redovisar tre datorlaborationer. Man skall dessutom skriva en tentamen. Varje labb ger tre bonuspoäng till tentan om de redovisas i tid. Slide 5 Labb 1 - Grundläggande C++ Senast redovisad på labbtillfället onsdagen 19 sept (v.38) klockan 17.00 Labb2-Kalender Senast redovisad på labbtillfället onsdagen 3 okt (v.40) klockan 17.00 Projektuppgift: Äventyrsspel Senast redovisad på labbtillfället onsdagen 17 okt (v.42) klockan 15.00 Tentamen Torsdagen 25 okt (v.43) klockan 8.00-13.00 i E31-36 Del1 grundläggande C++ Ämnesområden denna föreläsning: Datatyper Slide 6 Funktioner och funktionsanrop Sammansatta datatyper Pekare, aritmetik och referenser Minneshantering, preprocessorn

2D1387, Programsystemkonstruktion med C++ 01/02 4 Kort historik Bjarne Stroustrup skapade C with Classes 1980. År 1983 användes det för första gången av en extern forskargrupp. Slide 7 Namnet kommer från C och ++-operatorn och betyder att C++ är en utökning och förbättring av C. BCPL C Algol 68 Simula 67 syntax C++ klasskonceptet Ett första exempel i len hello.cpp Slide 8 #include <iostream> int main() cout << "Hello world!" << endl; return 0; } Använd module för att få rätt miljö och g++ för att kompilera datan> module add gcc datan> g++ -o hello hello.cpp Kör programmet datan> hello Hello world!

2D1387, Programsystemkonstruktion med C++ 01/02 5 Exempel på en klass i header len fraction.h: Slide 9 class Fraction public: Fraction(int n, int d = 1) : numer(numer), denom(denom) } Fraction(const Fraction &f); operator double() const; const Fraction operator+(const Fraction &) const; Fraction &operator=(const Fraction &); bool operator==(const Fraction &); private: int numer; int denom; }; Exempel på medlemmar i implementations len fraction.cpp: Slide 10 const Fraction Fraction::operator+(const Fraction &f) const return Fraction(numer * f.denom + f.numer * denom, denom * f.denom); } Fraction & Fraction::operator=(const Fraction &f) if(this == &f) return *this; numer = f.numer; denom = f.denom; }

2D1387, Programsystemkonstruktion med C++ 01/02 6 Datatyper I programspråket C++ nns följande grundläggande datatyper: bool sanningsvärde, true eller false char heltal, 8 bitar. Används ofta för att lagra bokstäver short heltal, oftast 16 bitar Slide 11 int heltal, oftast 32 bitar long heltal, större eller lika med int float yttal double yttal med dubbel precision pekare håller adressen till en av ovanstående typer eller annan, mer komplicerad typ. Exempel på användning av datatyper Slide 12 bool b = true; // sanningsvariabel int i = 85; // i tilldelas värdet 85 int j = i; // j blir 85 char a = 'x'; // a blir 120 = asciivärdet för 'x' float f = 3.1; // flyttal double d = 3.141593; // dubbel precision signed int k = 17; unsigned char c = 4; // heltal med tecken (default) // positivt heltal int *q = &i; int *p = 0; // pekare till ett heltal // pekare till null

2D1387, Programsystemkonstruktion med C++ 01/02 7 Funktioner och funktionsanrop För att dela upp sitt program i logiska delar använder man funktioner Slide 13 Vid anropet till funktionen skickar man med argument Alla anrop är värdeanrop (call by value) vilket innebär att det är kopior av argumenten som används under körningen av funktionen. Undantag: referenser och vektorer. Tillbaka får man ett returvärde En funktion bör ha en deklaration. En funktion som används har precis en de nition. Slide 14 double maximum(double, double); // deklaration int main() double d = maximum(1.7, 3.2); // anrop cout << "d = " << d << endl; // mata ut d = 3.2 return 0; } double maximum(double d1, double d2) // definition if(d1 > d2) return d1; // returvärde else return d2; // returvärde }

2D1387, Programsystemkonstruktion med C++ 01/02 8 Funktioners egenskaper i C++ Funktioner kan ta ett förvalt argument (default argument) Funktioner med samma namn och olika argument kallas överlagringar Funktioner kan deklareras inline, vilket är ett förslag till kompilatorn att ersätta funktionsanropet med programkod Slide 15 int f(char c, int i = 7); int g(int); int g(double); int g(a); // ett förvalt argument // g tar int // överlagring // överlagring int h(double d); inline int h(double d) return d; } // deklaration // inlinedefinition Uppräkningar Typen enum gör uppräkningar mer läsbara: Slide 16 enum weekday Mon, Tue, Wed, Thu, Fri, Sat, Sun, daycount}; enum wingdings foo = 11, bar = 3, baz}; weekday today = Mon; cout << "Today is day number " << today + 1 << endl; cout << "There are " << daycount << " days of the week" << endl; cout << "bar = " << bar << ", " << "baz = " << baz << endl;

2D1387, Programsystemkonstruktion med C++ 01/02 9 Utdata blir Slide 17 Today is day number 1 There are 7 days of the week bar = 3, baz = 4 Sammansatta datatyper Man kan skapa vektorer av en given datatyp. Slide 18 int a[7]; // alla element oinitierade int b[] = 1, 2, 3}; // b har 3 element int c[2] = 7, 8}; char r[] = 'b', 'a', 'r', '\0'}; char s[] = "bar"; // s har 4 element pga '\0' char t[4] = "bar";

2D1387, Programsystemkonstruktion med C++ 01/02 10 Indexoperatorn Åtkomst i vektorer sker genom att använda []-operatorn. Elementen i en vektor är indexerade från noll. Slide 19 int c[2] = 7, 8}; cout << "c[0] = " << c[0] << endl; // c[0] är 7 cout << "c[1] = " << c[1] << endl; // c[1] är 8 c[0] = 5; // c[0] blir 5 class en kort introduktion För att kapsla in data med funktioner använder man datatypen class precis som i Java. Åtkomsttypen avgör vem som kan se in i instanser av klassen. Slide 20 class Foo int i; // åtkomst private är default public: int j; // alla kommer åt j int fnk(double d) // publik funktion som tar double return (int)d; } //...och returnerar heltalsdelen private: int k; // endast medlemsfunktioner når k };

2D1387, Programsystemkonstruktion med C++ 01/02 11 struct envariantavclass Den enda skillnaden mellan class och struct är att åtkomsttypen är private i class medan den är public i struct. Slide 21 struct Bar int i; long j; }; Bar a = 7, 4711}; // lista av initierare Bar b; // medlemarna oinitierade b.i = 7; // tilldelning b.j = 4711; Union Det händer att man har behov av en typ som kan hålla olika sorters data i sig, man använder då union. Storleken på den sammansatta typen blir storleken av den största datatypen. Slide 22 union Baz int i; long l; double d; int a[7]; } b; // skapa objekt b av typ union Baz b.a[3] = 5; // tilldela en medlem b.i = 7; // skriv över och tilldela annan medlem

2D1387, Programsystemkonstruktion med C++ 01/02 12 Pekare En pekare är en adress till en plats i minnet Alla variabler och funktioner i ett program har en adress och kan pekas på Slide 23 Pekare ger upphov till många fel, och dessa kan vara svåra att nna int i = 7; // i är 7 int *ip = 0; // pekare till en int ip = &i; *ip = 8; // ip innehåller adressen till i // avreferera pekaren och tilldela // i är nu 8 Ytterligare ett exempel på pekare Slide 24 char c; char *s = "foobar"; char *t; c = s[3]; t = s; t = &s[0]; t = &s[4]; // c är nu 'b' // t pekar på 'f' // t pekar på 'f' // t pekar på 'a'

2D1387, Programsystemkonstruktion med C++ 01/02 13 Ett exempel på när det går fel med pekare int *i = int_pointer(); cout << "i = " << *i << endl; // skriver ut ett skräptal Slide 25 int *int_pointer() int i = 7; return &i; } // fel: lokal variabel är // ogiltig då funktionen returnerat Pekare, vektorer och sizeof En vektor konverteras till en pekare vid användning Man kan addera en pekare med ett heltal, s.k. pekararitmetik Man kan subtrahera pekare men inte addera Slide 26 int a[] = 0, 1, 2, 3, 4}; int *p; int j; p = a + 1; // p pekar på 1 j = a[2]; // j är 2 j = p[2]; // j är 3 *(a+1) = 5; // a är 0,5,2,3,4} j = sizeof a[2]; // j är 4 j = sizeof(int); // j är 4 j = sizeof a; // j är 20

2D1387, Programsystemkonstruktion med C++ 01/02 14 Referenser Referenser är ett sätt att undvika syntaxen hos pekare En referens refererar alltid till ett objekt eller en variabel Objekt och referenser är syntaktiskt ekvivalenta class A public: int i; } a; Slide 27 A *ap; A &arf; A &ar = a; // ap är pekare till A // fel: arf måste referera objekt // ok: ar refererar a ap = &a; int i = ap->i; ap = &ar; i = ar.i; // ap är adressen till a // avreferera pekaren till a // ap är adressen till a // ar används istället för a Typer och typde nitioner De nitioner av typer kan vara svåra att förstå i C++ Man kan använda typedef för att döpa om en typ int ipart(double); // deklarera funktion Slide 28 typedef char str[7]; // str är en vektor av 7 char typedef int (*funct)(double); // funct är funktionspekare str x = "foo"; funct f = ipart; int i = f(3.14); // x är en vektor av 7 char // f pekar till funktionen ipart // f anropar funktionen ipart int *api[5]; int (*pai)[5]; // vektor av pekare till int // pekare till vektor av int

2D1387, Programsystemkonstruktion med C++ 01/02 15 Styrstrukturer Styrstrukturerna i C++ är desamma som i Java. int i = 7, j; Slide 29 if(i) } else } i = a > b? a : b; for(i = 0; i < 17; i++) } while(i) } do } while(i); // if-else // villkorsoperatorn // loop med for // loop med while // loop med do-while switch(i) case 1: f(); break; case 2: g(); break; default: h(); break; } // switch-case Operatorer Operatorerna är desamma som i Java (med några undantag) och har samma prioritetsordning (precedence) och associativitet: Slide 30 Funktionsanrop m.m. () [] :: ->. ->*.* Unära operatorer! ~ ++ -- + - * & Aritmetiska operatorer + - * / % Jämförelseoperatorer < <= >= > ==!= Bitvisa operatorer & ^ ~ << >> Logiska operatorer && Jämförelseoperatorn?: Tilldelning += -= &= ~= <<= etc. Kommaoperatorn,

2D1387, Programsystemkonstruktion med C++ 01/02 16 Minneshantering Lokala objekt allokeras på stacken och har kort livslängd Objekt med längre livslängd måste allokeras dynamiskt på heapen Dynamisk allokering görs med new och delete Slide 31 void foo() A a; // a allokerad på stacken A *ap = new A; // dynamiskt allokerad A *aa = new A[5]; // vektor med 5 A-objekt delete ap; // frigör allokerat minne delete aa; // fel: odefinierat beteende! delete [] aa; // ok: destruktor för 5 element } /* vid funktionens slut frigörs a automatiskt */ Statiska objekt i funktioner Statiska objekt allokerar eget minne Värdet på objekten behålls och ändras inte mellan anropen Minne allokeras och konstruktor körs vid första användningen, inte tidigare Slide 32 void foo() static bool initialized = false; if (!initialized) /* do initialization */ }... }

2D1387, Programsystemkonstruktion med C++ 01/02 17 Preprocessorn Körs innan programmet ses av kompilatorn Används för att inkludera/exkludera källkod Kan användas för att de niera konstanter och makron Slide 33 C++ har många tekniker för att undvika preprocessorn, såsom inline, template och const #include <iostream> #include "myfile.h" // inkluderar filen iostream // letar i lokal katalog först #ifdef MSDOS #include <conio.h> #endif // inkludera endast om MSDOS-miljö Preprocessorn Exempel på konstanter och makron: #ifndef MYFILE_H #define MYFILE_H // kontrollera så att filen // inte inkluderas 2 ggr Slide 34 #define PI 3.14159265 // konstant #define max(x, y) ((x) > (y)? (x) : (y)) // makro #if 0 // kompileras inte cout << "You won't see this one" << endl; #endif #endif // matchar #ifndef MYFILE_H