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



Relevanta dokument

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

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

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

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

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

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

1 Klasser och objektorientering Vad är objektorientering?

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TDDC76 - Programmering och Datastrukturer

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

TDIU01 Programmering i C++

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Dynamisk bindning och polymorfism

TDDC76 - Programmering och Datastrukturer

TDDC76 Programmering och datastrukturer

Högskolan Dalarna sid 1 av 5 Data-avdelningen Hans-Edy Mårtensson

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Introduktion till arv

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

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

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

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

5 Arv och dynamisk bindning FIGUR

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

maxlist-1. Indexerad lista Länkad lista

Övningar Dag 2 En första klass

Innehåll. Pekare Exempel

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

Innehåll. Pekare Exempel

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

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

TDIU01 - Programmering i C++, grundkurs

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

C++ Objektorientering - Klasser. Eric Elfving

Programmering B med Visual C

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

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

Objektorienterad programmering Föreläsning 5

Java, klasser, objekt (Skansholm: Kapitel 2)

Objektorienterad Programmering (TDDC77)

TDIU01 - Programmering i C++, grundkurs

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

JAVA Mer om klasser och objektorientering

Arv bakgrund (kap. 9)

OOP Objekt-orienterad programmering

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

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

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

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

Funktionens deklaration

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

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

TDIU01 - Programmering i C++, grundkurs

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

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Skizz till en enkel databas

(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

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

Det finns många flaggor till g++,

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Klasshierarkier - repetition

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

Malmö högskola 2008/2009 CTS

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

C++ - En introduktion

Enkla datatyper minne

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

Tillämpad programmering

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

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

JAVAUTVECKLING LEKTION 11

Klasser och objekt i C#

TDDC76 - Programmering och Datastrukturer

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

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Objektorienterad programmering

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

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

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Objektorienterad Programmering (TDDC77)

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

C++ Lektion Tecken och teckenfält

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

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

TDDC76 - Programmering och Datastrukturer

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

Objektorientering i liten skala

OOP Objekt-orienterad programmering

Programsystemkonstruktion med C++

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

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

TDDC76 - Programmering och Datastrukturer

Transkript:

KAPITEL 8 Klasser Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering. 169 Hittills: Enkel datatyp: double, int, char Operationer: förutbestämda, t ex +, -, *, /, %. Arrayer (fält): Gruppering av element med samma sorts datatyp (enkel eller array). Operationer: kan indexeras. Nu: Klasser: Gruppering av element med lika eller olika sorters datatyper, t ex enkla, arrayer, andra klasser. Operationer: programmeraren bestämmer dessa själv genom att skriva speciella funktioner för klassen. Början till s k objektorienterad programmering. En klass är en mängd av s k objekt. Ex. Antag vi vill definiera en datatyp som beskriver en vara i en affär. Frågor: 1) Hur skall varan representeras? 2) Vad vill vi kunna göra med varan? Svar 1): T ex kan varan karaktäriseras av Namn Pris Antal (i lager) (sträng) (double) (int) Vi låter klassen heta Vara. De ingående delarna i klassen kallas för (data)attribut eller datamedlemmar. Vi skall visa att man kan tillverka varor, dvs deklarera några variabler att ha datatypen Vara. Dessa variabler är då objekt i klassen Vara. 170 171

Svar 2): Vi vill kunna göra följande med en vara (dvs en variabel av typen Vara): Ge varan initialvärden, t ex läsa in data om en ny vara. Få hem nya varor av samma sort, dvs addera varor till lagret. Sälja varor, dvs ta bort varor ur lagret. Sätta nytt pris på varan, givet en procentfaktor. Skriva ut information om en vara. Vi har nu följande grafiska beskrivning på ett objekt i klassen Vara: Vara char Namn[100] double Pris int Antal Klassens namn Attribut (data i klassen) Centralt i objektorienterad programmering: Operationer på ett objekt definieras som s k medlemsfunktioner (metoder) i klassen. LaesIn TillLager Saelja ProcentPris SkrivUt Medlemsfunktioner (operationer på data) Punkterna ovan kommer att representeras av medlemsfunktionena: LaesIn, TillLager, Saelja, ProcentPris, SkrivUt 172 173 Klassdeklaration i C++: class Klassnamn deklarationer av gömda attribut deklarationer av synliga medlemsfunktioner ; Man låter data vara private. Innebär att ingen utanför klassen kan komma åt dessa datafält. Enbart klassens egna funktioner får använda dessa. Alla data kan kommas åt direkt från alla medlemsfunktioner utan parameteröverföring. Man låter medlemsfunktioner vara public. Innebär att de kan kommas åt utifrån, t ex från main. Sammanfattning: Objektorientering innebär att uppmärksamheten riktas på objekt inom det problemområde uppgiften gäller. Uppgiften löses genom samverkan mellan olika objekt. Programmeringen består i att definiera objekt och deras samverkansformer. Inkapsling: objekten innehåller både data och beteende (funktioner som gör något med data). En användare behöver inte veta hur en vara t ex representeras, bara vilka operationer som finns. Gömmer representationen av data ==> Flexibelt: kan ändra representationen av data men ofta ha samma huvudprogram kvar!(om ej funktionshuvudena i metoderna ändrats). ---------------------------- 174 175

// Vara1_alla.cc #include <iostream.h> #include <string.h> //Klassdeklaration för klassen Vara. class Vara char Namn[100]; double Pris; int Antal; void LaesIn() cout << "Ge varans namn:" << endl; cin.getline( Namn, sizeof( Namn ) ); cout << "Ge pris och antal i lager:" << endl; cin >> Pris >> Antal; cin.get(); //Så man kan läsa in ny vara senare.. void TillLager( int AntalNya ) //Nya till lagret. Antal += AntalNya; void Saelja( int AntalSaelj ) //Sälj vara. Antal -= AntalSaelj; void ProcentPris( double Faktor ) //Sätt nytt pris. void SkrivUt() //Skriv info om vara. cout << "\t Varunamn: " << Namn << "\t Pris: " << Pris << "\t Antal i lager: " << Antal << endl; ; //OBS! Semikolon efter slutklammern! 176 177 //================================================ // Huvudprogram som testar klassen Vara. Vara Mjoelk; Mjoelk.LaesIn(); Mjoelk. //Skapar obkektet Mjoelk. //Laes in data till Mjoelk-objektet. //Skriv ut info om varorna. Mjoelk.ProcentPris( 1.10 ); //Prisökning 10%. Mjoelk.TillLager( 100 ); // 100 nya från grossisten. Mjoelk.Saelja( 50 ); // Sälj 50 st Mjoelk. //Skriv ut info om varorna. return 0; //...slut på filen Vara1_alla.cc... För att få ett välstrukturerat och överblickbart program: Klassdeklaration först. main. definition (implementation) av metoder sist. OBS! Vara:: nedan anger klasstillhörighet. Olika klasser kan ha samma metodnamn, t ex vanligt med LaesIn, SkrivUt... $ a.out Ge varans namn: Mjölk Ge pris och antal i lager: 7.15 12000 Varunamn: Mjölk Pris: 7.15 Antal i lager: 12000 Varunamn: Mjölk Pris: 7.865 Antal i lager: 12050 Senare kommer vi att dela upp dessa programdelar på olika filer, dvs deklarationen på en fil, implementationen på en och main på en. 178 179

//=============================================== // Vara1.cc, variant av Vara1_alla.cc // #include <iostream.h> #include <string.h> //Klassdeklaration för klassen Vara. class Vara char Namn[100]; double Pris; int Antal; void LaesIn(); void TillLager( int AntalNya ); void Saelja( int AntalSaelj ); void ProcentPris( double Faktor ); void ; //Nya till lagret. //Sälj vara. //Sätt nytt pris. //Skriv info om vara. //================================================= // Huvudprogram som testar klassen Vara. Vara Mjoelk; Mjoelk.LaesIn(); Mjoelk. //Skapar obkektet Mjoelk. //Laes in data till Mjoelk-objektet. //Skriv ut info om varorna. Mjoelk.ProcentPris( 1.10 ); //Prisökning 10%. Mjoelk.TillLager( 100 ); //100 nya från grossisten Mjoelk.Saelja( 50 ); //Sälj 50 st. Mjoelk. //Skriv ut info om varorna. return 0; //================================================= // Implementation (definition) av metoder i klassen Vara. void Vara::LaesIn() cout << "Ge varans namn:" << endl; cin.getline( Namn, sizeof( Namn ) ); cout << "Ge pris och antal i lager:" << endl; cin >> Pris >> Antal; cin.get(); //Saa man kan laesa in ny vara senare... 180 181 void Vara::TillLager( int AntalNya ) Antal += AntalNya; void Vara::Saelja( int AntalSaelj ) Antal -= AntalSaelj; void Vara::ProcentPris( double Faktor ) void Vara::SkrivUt() cout << "\t Varunamn: " << Namn << "\t Pris: " << Pris << "\t Antal i lager: " << Antal << endl; //...slut på filen Vara1.cc... Konstruktorer, selektorer och destruktorer: När man deklarerar vanliga variabler (enkla, arrayer) så kan man om man vill initiera dem samtidigt, t ex int sum = 0; double A[ 3 ] = 1.0, 3.7, -5.24 ; Objekt initieras med hjälp av s k konstruktorer. dessa är metoder med samma namn som klassen själv. 1) Parameterlös konstruktor kallas standardkonstruktor eller default-konstruktor. Anropas automatiskt vid deklaration av objekt, t ex Vara Mjoelk; //Här anropas standardkonstr automatiskt!... Definition: Vara::Vara() strcpy( Namn, ); Pris = 0.0; Antal = 0; // Tilldela tom sträng till Namn // Sätt Pris till 0 Kr // Inga varor i lager ännu. 182 183

2) Extrakonstruktor eller överlagrad konstruktor, dvs en konstruktor med en eller flera inparametrar. Man kan ha flera extrakonstruktorer (om alla dessa har olika antal parametrar) T ex Vara Mjoelk( Mjölk, 6.75, 15000 ); //Deklarera och initiera! Vara Franska; // Eller använd extrakonstruktor så här: Franska = Vara( Småfranska, 1.50, 45000 );... Definition: Vara::Vara( char innamn[], double inpris, int inantal ) strcpy( Namn, innamn ); Pris = inpris; Antal = inantal; Selektorer används för att få ut attributvärden (de var ju annars private -deklarerade, dvs gömda i klassen), t ex: Vara Mjoelk; Mjoelk.LaesIn(); cout << Antal i lager just nu: << Mjoelk.HaemtaAntal() << endl;... Definition av selektorer: double Vara::HaemtaPris() return Pris; int Vara::HaemtaAntal() return Antal; void Vara::HaemtaNamn( char utnamn[] ) strcpy( utnamn, Namn ); 184 185 Destruktorn i en klass har som enda uppgift att döda objekt. När man arbetar med dynamiskt allokerat minnesutrymme, så är det viktigt att frisläppa minnesutrymme som inte längre behövs. Om t ex en klass har dynamiska attribut (skapade med new i konstruktorerna), så bör man ha en destruktor som gör delete. Program utan pekare behöver ingen destruktor. Destruktorn, som är parameterlös, har samma namn som klassen, men med ett ~ tecken framför: Vara::~Vara() cout << Hej! Nu dödar jag ; Användandet av metoder (medlemsfunktioner): Utanför klassen, t ex i main, vanlig funktion eller metod i annan klass: objektnamn.metodnamn( ev. parametrar ); Ex. Vara ost; ost.laesin(); I någon annan av medlemsfunktionerna i samma klass: metodnamn( ev. parametrar); Ex. void Vara::ProcentPris( double Faktor ) // Skriv ut info om varan // innan priset ändras. 186 187

Användandet av attribut: Enbart i metoder i samma klass. Om aktuellt objekt så ingen punktnotation, men om deklarerad som lokal variabel eller i parameterlista så punktnotation: objektnamn.attributnamn; Ex. void Vara::KollaSammaPris( Vara annan ) if ( annan.pris == Pris ) cout << samma pris! << endl; Selektorer skickar ut attributvärden till världen utanför klassen. Exempel på ett program (med konstruktorer, destruktor och selektorer) som har en array av objekt i huvudprogrammet: //-----------------Varaenkel_array_i_main.cc #include <iostream.h> #include <string.h> //Klassdeklaration för klassen Vara. class Vara char Namn[100]; double Pris; int Antal; Vara(); //Standardkonstruktor. Vara( char innamn[], double inpris, int inantal ); //Annan konstruktor. ~Vara(); //Destruktor. double HaemtaPris(); //Selektorer: int HaemtaAntal(); void LaesIn(); void //Skriv info om vara. void TillLager( int AntalNya ); //Nya till lagret. void Saelja( int AntalSaelj ); //Sälj vara. void ProcentPris( double Faktor ); //Sätt nytt pris. ; 188 189 //================================================= // Huvudprogram som testar klassen Vara. // Skapa nu en hel array av objekt i klassen Vara. // Antag max st varor. const int MaxVaror = 5; int AntalVaror; Vara Artiklar[ MaxVaror ]; //Här används autom. //standardkonstruktorn 5 ggr! Artiklar[ 0 ] = Vara( Mjölk, 6.50, 3000 ); Artiklar[ 1 ] = Vara( Småfranska, 1.00, 150 ); Artiklar[ 2 ] = Vara( Äpple, 2.00, 7000 ); Artiklar[ 3 ].LaesIn(); AntalVaror = 4; cout << Vi skall sätta om priset på alla varor <<, ge faktorn: ; double Fakt; cin >> Fakt; for ( i = 0; i < AntalVaror; i++ ) Artiklar[i].ProcentPris( Fakt ); cout << Skriver ut varor med nya priser: << endl; for ( i = 0; i < AntalVaror; i++ ) Artiklar[i]. return 0; cout << Nu har vi följande varor i lager: << endl; for ( int i = 0; i < AntalVaror; i++ ) Artiklar[i]. 190 191

//================================================= //Implementation (definition) av metoder i klassen Vara. Vara::Vara() strcpy( Namn, ); //Tom sträng. Pris = 0.0; Antal = 0; cout << Hej default ; cout << endl; Vara::Vara( char innamn[], double inpris, int inantal ) strcpy( Namn, innamn ); Pris = inpris; Antal = inantal; cout << Hej överlagrad ; cout << endl; Vara::~Vara() cout << Hej då! ; void Vara::TillLager( int AntalNya ) Antal += AntalNya; void Vara::Saelja( int AntalSaelj ) if ( AntalSaelj <= Antal ) Antal -= AntalSaelj; else cout << Går ej! Det finns bara << Antal << st << Namn << i lager nu! << endl; void Vara::ProcentPris( double Faktor ) void Vara::SkrivUt() cout << \t Namn: << Namn << \t Pr: << Pris << \t Ant: << Antal << endl; 192 193 void Vara::LaesIn() cout << Ge varans namn: << endl; cin.getline( Namn, sizeof( Namn ) ); cout << Ge pris och antal i lager: << endl; cin >> Pris >> Antal; cin.get(); //Saa man kan laesa in ny vara //senare utan returnteckenkraangel.. Körning: Hej överlagrad Namn: Mjölk Pr: 6.5 Ant: 3000 Hej överlagrad Namn: Småfranska Pr: 1 Ant: 150 Hej överlagrad Namn: Äpple Pr: 2 Ant: 7000 Nu har vi följande varor i lager: Namn: Mjölk Pr: 6.5 Ant: 3000 Namn: Småfranska Pr: 1 Ant: 150 Namn: Äpple Pr: 2 Ant: 7000 Namn: banan Pr: 34 Ant: 250000 Vi skall sätta om priset på alla varor, ge faktorn: 0.50 Skriver ut varor med nya priser: Namn: Mjölk Pr: 3.25 Ant: 3000 Namn: Småfranska Pr: 0.5 Ant: 150 Namn: Äpple Pr: 1 Ant: 7000 Namn: banan Pr: 17 Ant: 250000 Hej då! Namn: Äpple Pr: 2 Ant: 7000 Hej då! Namn: Småfranska Pr: 1 Ant: 150 Hej då! Namn: Mjölk Pr: 6.5 Ant: 3000 Hej då! Namn: Pr: 0 Ant: 0 Hej då! Namn: banan Pr: 17 Ant: 250000 Hej då! Namn: Äpple Pr: 1 Ant: 7000 Hej då! Namn: Småfranska Pr: 0.5 Ant: 150 Hej då! Namn: Mjölk Pr: 3.25 Ant: 3000 Ge varans namn: banan Ge pris och antal i lager: 34 250000 194 195