C++ Objektorientering - Klasser. Eric Elfving

Relevanta dokument
TDDC76 - Programmering och Datastrukturer

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

TDIU01 Programmering i C++

Övningar Dag 2 En första klass

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

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

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

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

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

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

TUTORIAL: KLASSER & OBJEKT

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

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

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

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

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

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

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

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

Dynamisk bindning och polymorfism

Tillämpad programmering

Introduktion till arv

1 Klasser och objektorientering Vad är objektorientering?

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

Objektorienterad programmering Föreläsning 5

TDIU01 - Programmering i C++, grundkurs

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

OOP Objekt-orienterad programmering

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

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Kapitel 6 - Undantag

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Kopiering av objekt i Java

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

JAVA Mer om klasser och objektorientering

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

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

5 Arv och dynamisk bindning FIGUR

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

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

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

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Collections Collections "Envisa" objekt Klasserna Bofstream och Bifstream Definition av metoder i klasserna Bifstream och Bofstream Klassen Streng

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

TDDC76 - Programmering och Datastrukturer

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

Tentamen EDAF30 Programmering i C++

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

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Objektorientering i liten skala

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

Java, klasser, objekt (Skansholm: Kapitel 2)

Objekt, Klasser, Paket m. m.

Inledande programmering med C# (1DV402) Tärningarna ska kastas

Exceptions (undantag) Murach s: kap 7

JAVAUTVECKLING LEKTION 11

TDDC76 - Programmering och Datastrukturer

Det finns många flaggor till g++,

Programsystemkonstruktion med C++

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

allokeras på stacken dynamiskt new delete

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Minneshantering. Minneshantering. Minneshantering. Undvik pekare


Felhantering TDDD78, TDDE30, 729A

C++ - En introduktion

TDIU01 - Programmering i C++, grundkurs

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

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Malmö högskola 2007/2008 Teknik och samhälle

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

TENTAMEN OOP

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Tentamen EDAF30 Programmering i C++

Innehåll. Pekare Exempel

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

Objektorienterad programmering

OOP Objekt-orienterad programmering

Föreläsning 5-6 Innehåll

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Generiska konstruktioner. Kursbokens kapitel 13

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Funktionens deklaration

Innehåll. Pekare Exempel

Metoder (funktioner) Murach s: kap Winstrand Development

Föreläsnings 9 - Exceptions, I/O

TDIU01 (725G67) - Programmering i C++, grundkurs

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

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

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

Objektorientering - Arv och polymorfi

Skizz till en enkel databas

Transkript:

C++ Objektorientering - Klasser Eric Elfving

1 / 20 Återblick struct struct är bra att ha för att skapa aggregat - slå ihop flera data till en ny datatyp. Ett problem med struct är åtkomst...

2 / 20 Följande ser vettigt ut... struct Time int hour; int minute; int second; ; Time next_second(time const & t) Time next t; next.second++; if ( next.second == 60 ) // öka minut, kolla om timme måste öka osv. return next;

3 / 20 Vad händer om vi gör följande: Time t132, 22, 333; Time t2 next_second(t) ;

3 / 20 Vad händer om vi gör följande: Time t132, 22, 333; Time t2 next_second(t) ; Vad bör hända?

4 / 20 Med en klass kan vi dölja våra datamedlemmar: class Time private: int hour ; int minute ; int second ; ;

5 / 20 Nu kan vi inte komma åt fälten som vi gjorde i en struct. En speciell funktion, kallad konstruktor, används för att initiera en klass class Time public: Time(int h, int m, int s) : hourh, minutem, seconds // initiering //av datamedlemmar // eventuell annan kod man vill köra // (exempelvis kontrollera värdena) private: int hour, minute, second; ;

6 / 20 Målet med en konstruktor är alltid att initiera datamedlemmarna. Konstruktorn har alltid samma namn som klassen och saknar returtyp. Time t12,32,11; // anrop till konstruktor. // t är ett objekt av typen Time

7 / 20 Om vi vill kunna skapa ett "tomt" Time-objekt (dvs få något standardvärde), behövs en defaultkonstruktor. En konstruktor som kan anropas utan argument kallas defaultkonstruktor. class Time public: Time() : hour12, minute, second //... ; Time t; // defaultkonstruktorn anropas En klass kan endast ha en defaultkonstruktor.

8 / 20 Utöver data kan en klass även ha beteende i form av medlemsfunktioner En medlemsfunktion är precis som en vanlig funktion, men deklareras i klassen. En medlemsfunktion har direkt tillgång till värdena som tillhör ett specifikt objekt. Vilket objekt vi utför beräkningar för bestäms i anropet.

9 / 20 class Time public: //... konstruktorer bool is_pm() return hour >= 12; private: int hour, minute, second; ; int main() Time t 13,12,12; if ( t.is_pm() ) // anropar is_pm för objektet t //...

10 / 20 Felhantering Vad ska vi göra om användaren ger oss felaktiga värden? Time t 132, 78, 223;

11 / 20 Vi skulle kunna sätta standardvärden: class Time public: Time(int h, int m, int s) : hourh, minutem, seconds if (!is_valid() ) hour = 0; minute = 0; second = 0; //... private: bool is_valid() return hour < 24 && minute < 60 && second < 60; int hour, minute, second; ;

12 / 20 Men undantag är bättre! #include <stdexcept> class Time public: Time(int h, int m, int s) : hourh, minutem, seconds if (!is_valid() ) throw std::domain_error"ej giltigt klockslag!"; //... ; Här kastar vi ett undantag. Om användaren (den som skapar ett Time-objekt) inte tar hand om undantaget kommer programmet krascha.

13 / 20 Man fångar undantag i ett try-block. try Time t 123, 33, 22; catch (std::domain_error) cerr << "Fel vid skapande av klockslag!";

14 / 20 Inkluderingsfilen <stdexcept> har flera färdiga undantagstyper som man kan välja ifrån när man ska kasta ett undantag Vi kommer senare ta upp hur man skapar egna, men nu räcker det att välja ett passande bland de färdiga.

15 / 20 const Säg att vi skapar följande fristående funktion för att skriva ut Time: void print(time const & t) cout << t.get_hour() << ':' << t.get_minute() << ':' << t.get_second();

16 / 20 För att det ska kompilera behöver vi såklart lägga till funktionerna i klassen: class Time public: int get_hour() return hour; int get_minute() return minute; int get_second() return second; //... ;

17 / 20 Kompilatorn kommer ändå ge oss fel: In function void print(const Time&) : error: passing const Time as this argument discards qualifiers cout << t.get_hour() << ':' << t.get_minute() << ':' << t.get_second(); ^ Vi måste säga till kompilatorn att våra funktioner inte får ändra på nuvarande objekts datamedlemmar.

18 / 20 Än en gång är det nyckelordet const som gäller: class Time public: int get_hour() const return hour; int get_minute() const return minute; int get_second() const return second; //... Alla medlemsfunktioner som inte ska ändra på datamedlemmarna bör markeras med const! Rekommendationen är att göra alla funktioner const och ta bort det om du faktiskt vill modifiera data.

19 / 20 Klasser och filuppdelning Det är det smidigt att dela upp sin kod på olika filer för att få bättre översikt. För klasser gör man det genom att definiera klassen (med deklarationer av samtliga medlemsfunktioner och datamedlemmar) i en inkluderingsfil (.h-fil) och definerar medlemsfunktionerna separat i en implementationsfil (.cc-fil)

20 / 20 Listing 1: Time.h #ifndef TIME_H #define TIME_H class Time public: Time(int,int,int); Time(); int get_hour() const; int get_minute() const; int get_second() const; Time next_second() const; private: int hour; int minute; int second; bool is_valid() const; ; #endif Listing 2: Time.cc #include "Time.h" Time::Time() : hour, minute, second Time::Time(int h, int m, int s) : hourh, minutem, seconds int Time::get_hour() const return hour; //...

Eric Elfving www.liu.se