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

Relevanta dokument
TDDC76 - Programmering och Datastrukturer

C++ Objektorientering - Klasser. Eric Elfving

TDIU01 Programmering i C++

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Övningar Dag 2 En första klass

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

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

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

TUTORIAL: KLASSER & OBJEKT

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

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

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

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

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

TDIU01 - Programmering i C++, grundkurs

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

TDDC76 - Programmering och Datastrukturer

Dynamisk bindning och polymorfism

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

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

Generiska konstruktioner. Kursbokens kapitel 13

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

Objektorienterad programmering Föreläsning 5

Programsystemkonstruktion med C++

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

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

OOP Objekt-orienterad programmering

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

Objektorientering i liten skala

Kapitel 6 - Undantag

5 Arv och dynamisk bindning FIGUR

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

Kopiering av objekt i Java

JAVA Mer om klasser och objektorientering

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

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

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

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

C++ - En introduktion

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

DD2387 Programsystemkonstruktion med C++ Tentamen 2

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

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

Tillämpad programmering

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

1 Klasser och objektorientering Vad är objektorientering?

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

Introduktion till arv

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

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

Objekt, Klasser, Paket m. m.

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

Objektorientering - Arv och polymorfi

allokeras på stacken dynamiskt new delete

TDDC76 - Programmering och Datastrukturer

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

C++ - En introduktion

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

Felhantering TDDD78, TDDE30, 729A

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

Tentamen EDAF30 Programmering i C++

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

Exceptions (undantag) Murach s: kap 7

TENTAMEN OOP

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

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

TDIU01 - Programmering i C++, grundkurs

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

Det finns många flaggor till g++,

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

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

Metoder (funktioner) Murach s: kap Winstrand Development

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

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

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

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

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

TDDC76 - Programmering och Datastrukturer

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Grundläggande programmering med C# 7,5 högskolepoäng

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

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

Skapa, kopiera och destruera klassobjekt

Kapitel 5. Strömmar. Utmatning

Transkript:

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

1 / 23 Å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 / 23 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 / 23 Vad händer om vi gör följande: Time t132, 22, 333; Time t2 next_second(t) ;

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

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

5 / 23 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 / 23 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 / 23 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 / 23 Konstruktorn används istället för medlemsinitiering class Time public: Time(int h = 0, int m = 0, int s = 0) : hh, mm, ss private: int h13; // initiering här behövs bara om ingen int m15; // konstruktor garanterar initiering int s; ; Time t; // ger 00:00:00

9 / 23 En konstruktor kan initiera datamedlemmarna genom att anropa en befintlig konstruktor: class Time public: Time(int h, int m, int s) : hourh, minutem, seconds // initiering Time(string const& academic_hour) : Timestoi(academic_hour), 15, 0 // anrop av ovan Time() : Time12,0,0 // anrop av befintlig konstruktor //... ; Time t"13"; // ger tiden 13:15:00

10 / 23 Förutom 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.

11 / 23 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() ) // kallar på is_pm för objektet t //...

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

13 / 23 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; ;

14 / 23 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.

15 / 23 Undantag avbryter funktioner samma väg de anropades! #include <stdexcept > class Time public: Time(int h, int m, int s) : hourh, minutem, seconds check_valid(); private: void check_valid() if ( hour >= 24 minute >= 60 second >= 60 ) throw std::domain_error"ej giltigt klockslag!"; //... ; Om de inte fångas på vägen...

16 / 23 Man fångar undantag i ett try-block. try Time t 123, 33, 22; catch (std::domain_error) cerr << "Fel vid skapande av klockslag!"; Använder man catch-biblioteket kan man använda sig av CHECK_THROWS(...)

17 / 23 Inkluderingsfilen <stdexcept> har flera färdiga undantagstyper som man kan välja ifrån när man ska kasta ett undantag Vi kommer inför nästa lab (kalkylatorn) ta upp hur man skapar egna, men nu räcker det att välja ett passande bland de färdiga.

18 / 23 const Säg att vi skapar följande (ganska dåligt formaterade) utskriftsoperator för Time: ostream & operator <<(ostream & os, Time const & t) os << t.get_hour() << t.get_minute() << t.get_second(); return os;

19 / 23 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; //... ;

20 / 23 Kompilatorn kommer ändå ge oss fel: In function std::ostream& operator<<(std::ostream&, const Time&) : error: passing const Time as this argument discards qualifiers os << 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.

21 / 23 Ä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!

22 / 23 Klasser och filuppdelning Precis som för struct ä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 samtliga medlemsfunktioner och datamedlemmar) i en inkluderingsfil (.h-fil) och definerar medlemsfunktionerna separat i en implementationsfil (.cc-fil)

23 / 23 Listing 1: Time.h #ifndef TIME_H #define TIME_H // inga "using namespace..." här class Time public: // defaultvärden endast här Time(int h,int m,int s = 0); 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 // defaultvärden endast i h-filen Time::Time(int h, int m, int s) : hourh, minutem, seconds int Time::get_hour() const return hour; //...

Eric Elfving Institutionen för datavetenskap www.liu.se