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

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

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

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

C++-programmets beståndsdelar

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++

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

Kapitel 6 - Undantag

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

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

Programsystemkonstruktion med C++

Repetition C-programmering

Att använda pekare i. C-kod

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TDP005: Introduktion till Make

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

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

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

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

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

Tillämpad programmering

TDDC76 - Programmering och Datastrukturer

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

Innehåll. Pekare Exempel

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

Dynamisk bindning och polymorfism

Övningar Dag 2 En första klass

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

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

Tentamen EDAF30 Programmering i C++

TDIU01 - Programmering i C++, grundkurs

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. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Innehåll. Pekare Exempel

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

TDDC76 - Programmering och Datastrukturer

OOP Objekt-orienterad programmering

C++ Objektorientering - Klasser. Eric Elfving

Introduktion C-programmering

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

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

1 Klasser och objektorientering Vad är objektorientering?

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

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

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

TDIU01 Programmering i C++

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

Tillämpad programmering

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

TDIU01 - Programmering i C++, grundkurs

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

Programmering B med Visual C

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Tentamen i DD2387 Programsystemkonstruktion med C++

En kort text om programmering i C.

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

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

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

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

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

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

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

TDDC76 Programmering och datastrukturer

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

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

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

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

Imperativ programmering. Föreläsning 2

allokeras på stacken dynamiskt new delete

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

Pekare och arrayer. Indexering och avreferering

TDDC76 - Programmering och Datastrukturer

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Programmeringsteknik med C och Matlab

TDP005 Projekt: Objektorienterat system

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

Programmering i C++ Kompilering från kommandoraden

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

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

Värmedistribution i plåt

Poster ( structar ) Postdeklarationer

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

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

Classes och Interfaces, Objects och References, Initialization

Transkript:

Ett enkelt program i C++, hello.cpp 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 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 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 ). 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 > 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 "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 #if 0... // en sorts kommentarer,... // där man kan ha kommentarer i kommentarer 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 Automatiskt och dynamiskt minne 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... 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 "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 class Student { // deklarera klassen Student public: Student(std::string Name = ""); ~Student(); void learn(std::string); void speak(); private: std::string name; std::string knowledge; ;

#ifndef LECTURE_H #define LECTURE_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; ; 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