C++-programmets beståndsdelar

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

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

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

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

Det finns många flaggor till g++,

allokeras på stacken dynamiskt new delete

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

TDIU01 - Programmering i C++, grundkurs

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

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

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

Enkla datatyper minne

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

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

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

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

Kapitel 6 - Undantag

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

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

Innehåll. Pekare Exempel

Tommy Färnqvist, IDA, Linköpings universitet

Innehåll. Pekare Exempel

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

TDIU01 - Programmering i C++, grundkurs

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

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

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

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

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

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

Introduktion C-programmering

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

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

SP:PROG3 HT12 Tenta

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

C++ - En introduktion

Programsystemkonstruktion med C++

Pekare och arrayer. Indexering och avreferering

Att använda pekare i. C-kod

Parameteröverföring. Exempel. Exempel. Metodkropp

Programmering A. Johan Eliasson

Föreläsning 3-4 Innehåll

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

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

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

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

Programmering B med Visual C

Repetition C-programmering

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

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

TDIU01 Programmering i C++

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

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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

Programmeringsteknik med C och Matlab

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

Kapitel 5. Strömmar. Utmatning

Dynamisk bindning och polymorfism

C-programmering, föreläsning 1 Jesper Wilhelmsson

TDIU01 - Programmering i C++, grundkurs

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

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

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

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

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

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

Tentamen ges för: Tentamensdatum: Tid:

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

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

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

SMD 134 Objektorienterad programmering

Funktionens deklaration

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Poster ( structar ) Postdeklarationer

2 Pekare och dynamiska variabler.

En kort text om programmering i C.

F4. programmeringsteknik och Matlab

F5: Högnivåprogrammering

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Programsystemkonstruktion med C++

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

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

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

F5: Högnivåprogrammering

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

C++ - En introduktion

(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

Transkript:

C++-programmets beståndsdelar Ett C++-program är uppdelat i headerfiler (fil.h) och implementationsfiler (fil.cpp) Programmet måste innehålla åtminstone funktionen int main() main() startar programmet

C++-programmets beståndsdelar Ett första litet C++-program #include <iostream> // behövs för utskrifter int main() // main är obligatorisk i C++ { // utskrift av "Hello world!" och radbrytning std::cout << "Hello world!" << std::endl; } return 0; // avsluta programmet med värde 0

Byggstenar Inbyggda datatyper Funktionsanrop, argument och returvärden Styrstrukturer

Grundläggande datatyper I C++ finns många inbyggda datatyper. De flesta av dem representerar heltal: bool sanningsvärde, true eller false char oftast 8 bitar (ettor och nollor). Används ofta för att lagra bokstäver short oftast 16 bitar int oftast 32 bitar, datorns ordstorlek long int större eller lika med int

Grundläggande datatyper Övriga datatyper representerar flyttal... float flyttal, 16 bitar double flyttal med dubbel precision, dvs 32 bitar long double 64 bitars flyttal...och minnesplatser: Pekare Håller adressen till valfri datatyp, oftast 32 bitar (för att adressera datorns hela minne), även funktioner

Exempel på datatyper 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; // heltal med tecken (default) unsigned char c = 4; // positivt heltal int *q = &i; // pekare till ett heltal int *p = 0; // pekare till null

Funktioner och funktionsanrop För att dela upp sitt program i logiska delar använder man funktioner All kod i C++ ligger i funktioner Vid anrop till funktionen skickar man med argument Anrop i C++ är antingen värdeanrop (call by value) där argumentens värden kopieras eller referensanrop (mer om det senare) Tillbaka får man ett returvärde

Funktioner och funktionsanrop En funktion bör ha en deklaration En funktion som används har precis en definition double maximum(double, double); // deklaration int main() { double d = maximum(1.7, 3.2); // anrop std::cout << "d = " << d << std::endl; // d = 3.2 return 0; } double maximum(double d1, double d2) // definition { if(d1 > d2) return d1; // returvärde else return d2; // returvärde }

Funktioners egenskaper Funktioner kan ta ett förvalt argument (eng. 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

Funktioners egenskaper int f(char c, int i = 7); // ett förvalt argument f('a'); // anrop med förvalt arg = 7 f('a', 3); // anrop med annat arg = 3 int g(int); // g tar int int g(double); // överlagring int g(a); // överlagring int h(double d); // deklaration inline int h(double d) // inlinedefinition { return d; } double x = h(3.14); // anrop till inlinefunktion double y = 3.14; // anrop ersatt mha inline

Styrstrukturer Översikt: int i = 7; if(i) {} else {} // if-else i = a > b? a : b; // villkorsoperatorn for(i = 0; i < 17; i++) {} // loop med for while(i) {} // loop med while do {} while(i); // loop med do-while switch(i) { // switch-case case 1: f(); break; case 2: g(); break; default: h(); break; }

Styrstrukturer for for(int i = 0; i < 10; i++) // 10 varv { // i är synlig här } // i är inte synlig här const int size = 100; int j; for(j = 0; j < size; j++) // 100 varv std::cout << "varv " << j << std::endl;

Styrstrukturer while int i = 0; while(i < 100) // 100 varv { std::cout << "varv " << i << std::endl; i++; }

Styrstrukturer do while bool done = false; do { done = do_something(); /*... */ } while(!done);

Styrstrukturer switch case // skriv ut meny std::cout << "1. Öppna" << std::endl; std::cout << "2. Spara" << std::endl; std::cout << "3. Avsluta" << std::endl; // hämta tal från tangentbordet int value; std::cin >> value; switch(value) { case 1: open(); break; case 2: save(); break; case 3: quit(); break; default: std::cout << "ogiltig inmatning" << std::endl; }

Sammansatta datatyper Vektorer Strukturer Klasser Unioner

Sammansatta datatyper Man kan skapa vektorer av en given datatyp 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'}; // '\0' har värdet 0 char t[4] = "bar"; // "bar" är en sträng char s[] = "bar"; // s har 4 element pga '\0' Förklaring av strängar

Sammansatta datatyper Det finns inga inbyggda strängar i C/C++ (C++:s standardbibliotek innehåller dock en strängklass, std::string) Strängar i C/C++ representeras av en vektor av char, avslutad med bokstaven \0 (nolla) som har värdet noll och kallas NUL. Vill man använda en sträng läser man vektorn tills man stöter på bokstaven \0.

Indexoperatorn Åtkomst i vektorer sker genom att använda []-operatorn. Elementen i en vektor är indexerade från noll. int c[2] = {7, 8}; std::cout << "c[0] = " << c[0] << std::endl; // c[0] är 7 std::cout << "c[1] = " << c[1] << std::endl; // c[1] är 8 c[0] = 5; // c[0] är 5 // exempel på läsning av en sträng char str[4] = "foo"; int i = 0; while(str[i]!= '\0') // loopa tills str är slut { std::cout << str[i]; // skriv ut värdet i++; // öka värdet på i }

class - en kort introduktion För att kapsla in data tillsammans med funktioner använder man datatypen class Åtkomsttypen avgör vem som kan se in i instanser av klassen. class Foo { int i; // åtkomst private är default public: int j; // alla kommer åt j int fnc(double d) // funktion fnc som tar double och { // lägger till ett return d + 1; } private: int k; // endast medlemsfunktioner når k };

Struct - en variant av class Den enda skillnaden mellan class och struct är att åtkomsttypen är private i class och public i struct. struct Bar { int i; long j; }; Bar a = {7, 4711}; // lista av initierare Bar b; // medlemmarna oinitierade b.i = 7; // tilldelning b.j = 4711;

Uppräkningar Typen enum gör uppräkninar mer läsbara enum weekday {Mon, Tue, Wed, Thu, Fri, Sat, Sun, count}; enum wingdings {foo = 11, bar = 3, baz}; weekday today = Mon; std::cout << "Today is day number " << today + 1 << std::endl; std::cout << "There are " << count << " days of the week" << std::endl; std::cout << "bar = " << bar << ", " << "baz = " << baz << std::endl;

Uppräkningar Utdata blir Today is day number 1 There are 7 days of the week bar = 3, baz = 4

Pekare, minne och referenser Pekararitmetik Vektorer Referenser Ekvivalens Statiskt och globalt minne Dynamiskt minne

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å Pekare ger upphov till många fel, och dessa kan vara svåra att finna int i = 7; // i är 7 int *ip = 0; // pekare till en int ip = &i; // ip innehåller adressen till i *ip = 8; // avreferera pekaren och tilldela // i är nu 8

Pekare Ytterligare exempel på pekare char c; char *s = "foobar"; char *t; c = s[3]; // c är nu 'b' t = s; // t pekar på 'f' t = &s[0]; // t pekar på 'f' t = &s[4]; // t pekar på 'a'

Pekare Exempel på när det kan gå fel med pekare char *s = name(); std::cout << "my name is " << s // skriver ut skräp << std::endl; char *name() { char *str = "alice"; // fel: lokalt minne är return s; // ogiltig då funktionen returnerat }

Pekare, vektorer och minne En vektor konverteras till en pekare vid användning Man kan addera en pekare med ett heltal, s.k. pekararitmetik Man kan subtrahera pekare (avstånd) men inte addera

Pekare, vektorer och minne Exempel på hur pekare och vektorer opererar på datorns minne 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}

Pekare, vektorer och minne Objekt tar upp olika storlek i minnet. Pekararitmetik använder storleken för att bestämma avstånd mellan pekare int a[] = {0, 1, 2, 3, 4}; int j; j = sizeof a[2]; // j är 4 j = sizeof(int); // j är 4 j = sizeof a; // j är 20 int *p = a + 1; // stegar 1 vektorposition = 4 bytes

Minneshantering Lokala objekt allokeras på stacken och har kort livslängd Objekt med längre livslängd måste allokeras dynamiskt på heapen (free store) Dynamisk allokering görs med new och delete Statiska och globala objekt finns under programmets hela körtid

Minneshantering Minne (objekt) som allokerats med new ska deallokeras med delete Minne (vektorer av objekt) som allokerats med new[] ska deallokeras med delete[] 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 */

Minneshantering C++ har ingen automatrisk minneshantering (garbage collection) Alla dynamiska objekt som inte lämnas tillbaka läcker minne Speciellt viktigt är det att hålla ordning på minnet i objekt som skapas och destrueras ofta som t.ex. strängar.

Undvik vanliga problem Undvik pekare! Det är lätt att referera otillåtet minne (t.ex. genom att avreferera NULL) Det är lätt att referera ogiltigt minne (redan frigjort med delete) Skapa istället objekt på stacken Använd referenser! Dessa är garanterade att alltid referera ett giltigt objekt

Byggstenar Typdefinitioner Styrstrukturer Operatorer Preprocessorn

Operatorer Operatorerna i C++ har olika prioritetsordning (precedence) och associativitet: Funktionsanrop m.m. () [] :: ->. ->*.* Unära operatorer! ~ ++ -- + - * & Aritmetiska operatorer + - * / % Jämförelseoperatorer < <= >= > ==!= Bitvisa operatorer & ^ ~ << >> Logiska operatorer && Villkorsoperatorn?: Tilldelning += -= &= ~= <<= etc. Kommaoperatorn,

Preprocessorn Körs innan programmet ses av kompilatorn Används för att inkludera/exkludera källkod Kan användas för att definiera konstanter och makron C++ har många tekniker för att undvika preprocessorn, såsom inline, template och const

Preprocessorn #include <iostream> // inkluderar filen iostream #include "myfile.h" // letar i lokal katalog först #ifdef MSDOS // inkludera endast om MSDOS-miljö #include <conio.h> #endif

Preprocessorn Exempel på konstanter och makron: #ifndef MYFILE_H // kontrollera så att filen #define MYFILE_H // inte inkluderas 2 ggr #define PI 3.14159265 // konstant #define max(x, y) ((x) > (y)? (x) : (y)) // makro #if 0 // kompileras inte std::cout << "You won't see this one" << std::endl; #endif #endif // matchar #ifndef MYFILE_H