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

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

Det finns många flaggor till g++,

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

Programsystemkonstruktion med C++

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

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

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

C++-programmets beståndsdelar

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

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

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

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

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

Programsystemkonstruktion med C++

TDIU01 - Programmering i C++, grundkurs

Kapitel 6 - Undantag

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

Att använda pekare i. C-kod

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

TDDC76 - Programmering och Datastrukturer

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

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

Repetition C-programmering

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

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

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

Tillämpad programmering

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

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

TDP005: Introduktion till Make

Innehåll. Pekare Exempel

TDIU01 Programmering i C++

TDIU01 - Programmering i C++, grundkurs

1 Klasser och objektorientering Vad är objektorientering?

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

C++ Objektorientering - Klasser. Eric Elfving

Tentamen EDAF30 Programmering i C++

Tentamen i DD2387 Programsystemkonstruktion med C++

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

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

Innehåll. Pekare Exempel

TDDC76 - Programmering och Datastrukturer

OOP Objekt-orienterad programmering

allokeras på stacken dynamiskt new delete

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

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. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Dynamisk bindning och polymorfism

Övningar Dag 2 En första klass

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

Synlighet. Namespace Scope-operatorn Klasser Vänner

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

TDDC76 - Programmering och Datastrukturer

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

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

Tillämpad programmering

TDIU01 - Programmering i C++, grundkurs

TDP005. Föreläsning 2. Filip Strömbäck

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

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

Introduktion C-programmering

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

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

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

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

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

TDDC76 Programmering och datastrukturer

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

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

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

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

Programmering B med Visual C

1. Klass med en dynamiskt allokerad variabel, definitionsfilen-del Klass med en dynamiskt allokerad variabel, inkluderingsfilen.

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

En kort text om programmering i C.

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

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

Classes och Interfaces, Objects och References, Initialization

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

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

TDDC76 - Programmering och Datastrukturer

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

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

Transkript:

C++, Övning 1 Jonas Sjöbergh, jsh@nada.kth.se hur man kompilerar och kör make preprocessor minnesallokering, pekare grundläggande C++, funktioner m.m. ett exempel

Ett enkelt program i C++, hello.cpp #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } Då program körs anropas main (endast en main per program får länkas in). > g++ -o hello hello.cpp > hello Hello World > -o anger vad man vill att det körbara programmet ska heta. Annars blir namnet a.out

Det finns många flaggor till g++, här är några -g debug-information, bra när man letar efter fel -Wall g++ varnar för saker som är misstänkta -ansi kräver att man följer standarden -pedantic klagar mycket (bra!) -c ingen länkning -O optimera (programmet blir snabbare) -v kolla vilken version av kompilatorn man kör nu

Större program delas lämpligen upp i flera filer. Normalt lägger man deklarationer i header-filer (oftast.h ) och definitioner i källkodsfiler (oftast.cpp ). > g++ -c studenter.cpp > g++ -c klasser.cpp > g++ -c main.cpp > ls klasser.cpp klasser.o main.cpp main.o studenter.cpp studenter.o > g++ -o mitt_program klasser.o studenter.o main.o > mitt_program Man kan också göra > g++ -o mitt_program klasser.cpp studenter.cpp main.cpp > mitt_program Det första alternativet är bättre. När man ändrar i en fil behöver man bara kompilera om den och sen länka om. Sparar tid.

Makefile håller reda på vilka filer som behöver kompileras om. Mycket användbart. FLAGS= -g -Wall -ansi -pedantic # OBS!! alla indrag måste vara en TAB mitt_program: main.o studenter.o klasser.o g++ -o mitt_program main.o studenter.o klasser.o main.o: main.cpp studenter.h klasser.h g++ $(FLAGS) -c main.cpp studenter.o: studenter.cpp studenter.h klasser.h g++ $(FLAGS) -c studenter.cpp klasser.o: klasser.cpp klasser.h g++ $(FLAGS) -c klasser.cpp kör make, vilket kör första regeln (mitt program)

När man har många filer är det jobbigt att lista alla beroenden m.m. för hand. Det kan make göra åt oss. FLAGS= -g -Wall -ansi -pedantic FILES= main.o studenter.o klasser.o mitt_program: $(FILES) g++ $(FLAGS) -o $@ $^ %.o:%.cpp g++ $(FLAGS) -c $< depend: makedepend -- $(FLAGS) -- $(wildcard *.cpp) Kör make depend (första gången) och sen make

Preprocessorn kan lite av varje: #include <iostream> #include "studenter.h" // klistra in innehållet här #define MAX 10000 // använd const int MAX = 10000; istället #define SQR(X) (X)*(X) // använd inline och template istället #ifndef STUDENTER_H #define STUDENTER_H... // detta kommer klistras in högst 1 gång #endif #if 0... // en sorts kommentarer,... // där man kan ha kommentarer i kommentarer #endif

Funktioner int foo(int x); // deklaration int bar(int x) { return foo(x);} // definition int foo(int x) { return x+1;} int foobar(int x = 0) {foo(x); return bar(x);} foobar(2); // ok foobar(); // ok, x blir 0 double foo(double x) {... } // överlagring av foo inline int snabb(int x) {... } // inline betyder ungefär klistra in kroppen istället för att anropa

enum, en sorts heltalstyp enum color {white, red, blue}; // white = 0, red = 1, blue = 2 void foo(color c) { switch(c) { case white: bar(); break; case red: bar2(); break; case blue: bar2(); break; } } foo(white); // ok foo(2); // inte ok typedef ger nya namn till datatyper typedef char * CharPointer; CharPointer p = "hej";

Pekare En pekare är en adress i minnet. int *ptr = 0; ptr = new int; // allokera en int att peka på // ptr innehåller adressen till en int vi allokerat int *ptr2 = 0; int x = 3; ptr2 = &x; // peka på x // ptr2 innehåller adressen till x:s plats i minnet *ptr2 = 4; // nu är x == 4, * betyder följ pekaren

En array använder pekare implicit int foo[4]; // 4 integer int bar = {1, 27, 2}; // tre integer, med dessa värden int *ptr = new int[12]; // en array av 12 integer, allokerad bar[1]; // 27, första position har index 0 bar[i] är samma sak som *(bar + i) så 1[bar] kan man också skriva...

Automatiskt och dynamiskt minne Dynamiskt minne: Större än stacken, nödvändigt för stora objekt Storlek (t.ex. på array) kan bestämmas vid runtime Objekt kan leva utanför det scope de skapades i Måste frigöras när man är klar med det Automatiskt minne: Städas upp automatiskt, när scope tar slut Snabb allokering Mindre risk för slarvfel, används så ofta det går

int *p = new int[100];... delete p; // borde vara delete [] p int *p = new int[100]; int *p2 = new int[200]; p = p2; // minnesläcka, vi kan inte längre frigöra våra 100 integer delete [] p; int x = p2[10]; // bug! vi har redan gjort delete på minnet int *foo() { int x;... return &x; // x lokal! } int * p, p2; // p är int*, p2 är int int *p, *p2; // båda är int*

Kommentarer Kommentera er kod. Kommentarer är till dels för andra dels för ens egen skull. Pröva att läsa några andra studenters kod om ni tycker det verkar onödigt. All er kod i kursen förväntas vara kommenterad. Kommentarer i header-filer bör förklara formen på indata och utdata eller vad en klass är tänkt att göra. Kommentarer i källkodsfiler bör förklara implementationsdetaljer som ej framgår av programkoden.

#include "student.h" #include "lecture.h" int main() { Student s1("anna"); Student s2("per"); s1.learn("c++ is related to C."); s2.learn("g++ is a useful compiler."); } Lecture l(10); l.addstudent(s1); l.addstudent(s2); l.teach("ddd is a C++-debugger."); l.query(0); l.query(1); return 0; Anna says: C++ is related to C. DDD is a C++-debugger. Per says: g++ is a useful compiler. DDD is a C++-debugger.

#ifndef STUDENT_H #define STUDENT_H #include <string> class Student { // deklarera klassen Student public: Student(std::string Name = ""); ~Student(); void learn(std::string); void speak(); private: std::string name; std::string knowledge; }; #endif

#ifndef LECTURE_H #define LECTURE_H #include <iostream> #include <string> #include "student.h" class Lecture { // deklarera klassen Lecture public: Lecture(int); ~Lecture(); void query(int); void addstudent(student &); void teach(std::string); private: int capacity; int size; Student *members; }; #endif

#include <iostream> #include <string> #include "student.h" Student::Student(std::string Name) : name(name), knowledge("") {} Student::~Student() {} void Student::learn(std::string info) { knowledge += info;} void Student::speak() { std::cout << name << " says: " << knowledge << std::endl; }

#include "lecture.h" Lecture::Lecture(int cap) : capacity(cap), size(0) { members = new Student[cap]; } Lecture::~Lecture() { delete [] members;} void Lecture::addStudent(Student &s) { if(0 <= size && size < capacity) { members[size++] = s; } } // OBS! kopia av s void Lecture::query(int i) { if(i >= 0 && i < size) { members[i].speak(); } } void Lecture::teach(std::string info) { for(int i = 0; i < size; i++) { members[i].learn("\n\t"+info); } } // eftersom vi har new i konstruktorn borde vi egentligen skriva // operator=() och copy-konstruktor också, i verkligheten