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

Relevanta dokument
Programsystemkonstruktion med C++

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

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

Det finns många flaggor till g++,

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

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

Tillämpad programmering

Innehåll. Pekare Exempel

C++-programmets beståndsdelar

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

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

TDIU01 - Programmering i C++, grundkurs

Innehåll. Pekare Exempel

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Tillämpad programmering

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

TDIU01 - Programmering i C++, grundkurs

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

TDIU01 - Programmering i C++, grundkurs

Repetition C-programmering

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

Funktionens deklaration

Introduktion C-programmering

Programsystemkonstruktion med C++

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

Poster ( structar ) Postdeklarationer

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

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

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDDC76 - Programmering och Datastrukturer

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

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

Innehåll. Pekare Syntax

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

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

1 Namnkontroll (NameControl)

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

C++ Objektorientering - Klasser. Eric Elfving

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

TDDC76 - Programmering och Datastrukturer

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

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

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

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Att använda pekare i. C-kod

(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

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

F5: Högnivåprogrammering

TDDC76 Programmering och datastrukturer

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

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

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

F5: Högnivåprogrammering

Tommy Färnqvist, IDA, Linköpings universitet

Kapitel 6 - Undantag

TDIU01 Programmering i C++

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

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

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Tentamen EDAF30 Programmering i C++

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

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

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

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

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

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

Objektorienterad Programmering (TDDC77)

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

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

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

TDDC76 - Programmering och Datastrukturer

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

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Tentamen EDAF30 Programmering i C++

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

OOP Objekt-orienterad programmering

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

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

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

Transkript:

2 1 0 / ) - & 9 > ; 7 * ( ) ) En klass behöver både deklaration och definition Deklaration i h (hh) och definition i cc (cpp) Private är förvalt Student::learn() Student::Student() Student::~Student() Globala funktioner och variabler är OK main() är en global funktion Macro (inleds med #) körs av preprocessorn Daniel Aarno bishop@kthse $ # 4: 5687 34 4 E CD 4 B <?A@ : 7<= studenth #ifndef _STUDENT_ #define _STUDENT_ #include <iostream> #include <string> using std::string; class Student private: string knowledge_; public: Student(); ~Student(); void learn (string info); string speak(); ; #endif studentcc #include studenth Student::Student() knowledge_=; void Student::learn (string info) knowledge_=info; string Student::speak() return knowledge_; Kompilering och länkning Makefile Preprocessordirektiv Funktioner Funktionen main() Datatyper Minneshantering Pekare och arrayer Vanliga slarvfel Referenser Statiska variabler Kommentarer

4 ( & = 9< 7 56 1 $ 3-2 * 1 ) 0 / -$ $ )* #$ Filer kan kompileras var för sig till objektfiler (o) > g -c filecc > g -c maincc > ls fileo maino Flera objektfiler kan länkas samman till ett program (endast om main() är definerad) > g -o ex1 maino fileo > g -o ex1_debug -g -O1 maino fileo debug optimeringsnivå 1 maincc #include studenth int main() Student s; slearn(bla bla bla); cout << sspeak() << endl; return 0; För att köra programmet: > g -o ex1 maincc studentcc > /ex1 > bla bla bla D C B 9 =A > 9 = @9 > 9? = > 9 8:9; Om vi ändrar maincc räcker det att kompilera om den Men om vi ändrar i studentcc/h måste vi eventuellt kompilera om både studentcc och maincc (maincc beror på studenth) Jobbigt hålla reda på beroenden Långsamt att alltid kompilera om allt Intressanta fel om om allt som behöver kompileras inte kompileras om startkod bibliotekskod (lib*so lib*a) Källkod (cpp c h ) kompilator objektkod (o) Länkare exekverbar kod

# #include slår ihop filer innan kompilering #ifndef #define #endif garanterar att en fil bara inkluderas en gång //may be usefull #define MAX 10000 //dangerous #define SQR1(A) A*A //less dangerous #define SQR2(A) (A)*(A) #variables CC = g FLAGS = -g -I~/ckurs/student OBJ = maino studento #rules ex1: $(OBJ) $(CC) $(FLAGS) -o ex1 $(OBJ) #dont forget tab maino: maincc studenth $(CC) $(FLAGS) -c maincc studento: studenth $(CC) $(FLAGS) -c studentcc clean: rm *o ex1 - * ( ) $& En funktion Behöver inte defineras där den deklareras Behöver deklareras innan den används int foo(int x); // declaration of foo int bar(int x) 12 return foo(x); //call to foo int foo(int x) return x; //definition of foo Kan överlagras int foo(int x) //code here int foo(float x) //code here #variables CC = g FLAGS = -g -I~/ckurs/student OBJ = maino studento SRC = maincc studentcc #rules ex1: $(OBJ) $(CC) $(FLAGS) -o ex1 $(OBJ) o: cc $(CC) $(FLAGS) -c $*cc depend: makedepend $(FLAGS) $(SRC) clean: rm *o ex1 http://wwwgnuorg/manual/make3791/html_chapter/make_tochtml

* # & : 9 8 1 / /4 / 5 () $ # En funktion inline är användbart för korta funktioner som används ofta Over-head vid funktionsanrop är störst för små funktioner Inline gör att funktionsanropet ersätts med koden det innehåller vid kompileringstilfället För mycket inlining kan ge långsammare program och större filer För mycket inlining ger långsammare kompilering Kan ha argument med förvalt värde int foo(float f int x = 0); //< OK int foo(float f = 0 int x int y = 0); //< NOT OK Kan vara inline inline int sqr(int x) return x*x; 67 3 23 0 1 - Funktionen main() är speciell Kan inte heta något annat argc är antalet argument inkl programmets namn argv är en array av C-strängar med argumenten som gavs till programmet argv[0] är programmets namn (tex /usr/bin/zip eller zip) main() är en global funktion och således inte del av någon klass main() behöver inte deklareras Fördelar med funktionen sqr() Mer läsbar kod (samma anledning som macrot SQR) Ett ställe att ändra på Alla anrop till sqr funkar likadant Löser problemet med macrot SQR Det går slött att använda funktioner Argument måste kopieras och programmets exekvering måste styras om

1 0 2 & $ # Egna datatyper typedef char* charptr; enum Fruit apple banana orange ; struct int x; int y; double d; ; class int x; public: void foo(); ; union int x bool ok double d ; Testa sizeof(t); för olika typer T (int double charptr osv) maincc #include <iostream> int main(int argc char* argv[]) for(int i = 0; i < argc; i) std::cout << argv[i] << std::endl; > g maincc -o main > /main hej 12 hej 12 > (*) -/ ) (*) ) Automatiska objekt Städas automatiskt upp när scopet är slut Snabb allokering på stacken Mindre risk för slarvfel void foo(student s) //< begin scope int x; for(int i = 0; i < 5; i) //< begin scope int y = 2*i; x = 3 y; //< end scope (iy) //< end scope (xs) Inbyggda datatyper bool (true/false (1 byte)) char (1 byte) int (platformsberoende storlek = undvik) short long float (4 byte) double (8 byte) long double void (ingenting)

* & ) $ # & void foo(student *studptr) int *ptr i; //< ptr is ptr to int i is int int* x y; //< x is ptr to int y is int ptr = &i; //< ptr now holds address //< of i (eg 0xbfffff24) *ptr = 5; //< assign 5 to i x = ptr; //< x now also points to i; cout << *x << endl; //< would print 5 (*studptr)learn(``something); studptr->learn(``more); ptr = new int; //< ptr now holds adr //< of an int on the heap ptr = &y; //< error no way to access //< memory on heap anymore Dynamiska objekt Heap större än stack Arrayers längd kan bestämmas i run-time Objekt kan leva utanför scope där de skapas void foo(int nmemb) int *xptr; // Allocate array of nmemb ints xptr = new int[nmemb]; // do stuff then // delete memory allocated by new[] delete[] xptr; $ ( $# - $ # void foo(float f) char array[4711]; //< array of 4711 uninitialized chars int ary[] = 125; //< array of 3 initialized ints // same as const char str[] = jej0; char str[] = ``hej; char* ptr=0; //< char pointer to nothing const float *fptr; //< The memory pointed to by f is //< read-only float * const fcptr=f; //< The pointer f is read-only ptr = array; //< same as ptr = &array[0]; ptr[4] = x; //< set fifth element of array to x; *(ptr 4) = y; //< same thing but to y ptr = new char[512]; //< dynamicly allocated array CODE/TEXT Själva programkoden och konstanta variabler DATA Statiska (static) initialiserade variabler BSS Statiska icke initialiserade variabler STACK Automatiskt allokerade variabler vid körning Returvärden och returadresser 4kB på Linux kan växa till 2MB (default)

#$ # ( $( staticcc void foo() static int i = 5; cout << i << endl; int main() foo(); foo(); foo(); > /static 5 6 7 > void foo(int* p) delete p; int* bar() int x=1; return &x; //oops void fun() int* p1 p2; //p2 is normal int not pointer int *p3 = new int[2]; int *p4 = new int[2]; p3 = p4; //MEMORY LEAK foo(p3); //destruction of p3 (and p4) int x = p4[1]; //error (segfault if LUCKY) & Funktionskommentarer förklarar användning (h) /** * Send a signal to the task * * @param signal The signal to send (ie SIGINT) * @return true on success false on failiure */ bool sigsend(int signal); Procedurkommentarer förklarar implementationen (cc) /* getline reads one line from stdin and stores it in * the given buffer The newline is stored * The given buffer must be big enough to store the * trailing \0 (ie it must be at least one bigger * than nmax) */ void getline (char buf[] int nmax int *nread) //function implementation Som i Java Alias för ett objekt Som en pekare vars adress inte får ändras Måste referera till ett objekt (inte NULL) Snabbare skicka referens än objekt void iswap(int &i1 int &i2) int tmp = i1; i1 = i2; i2 = tmp; void main() int i = 5; int &iref = i; int *iptr = &i; iref; // i iref and // *iptr is now 6