Föreläsning 3
Klasser class namn { public: deklarationer av synliga medlemsfunktioner och datamedlemmar protected: private: deklarationer av gömda medlemsfunktioner och datamedlemmar };
Tillgänglighet (kap. 7.1) Utanför klassen kommer man bara åt synliga medlemmar (public) Utifrån används punkt eller pil för åtkomst av medlemmar (public) –Objektnamn.medlemsnamn –Pekare_till_objekt->medlemsnamn Inne i en medlemsfunktion kan man komma åt alla medlemmar utan punktnotation
Medlemsfunktioner (kap. 7.2) Bör definieras separat, utanför klassdefinitionen (i cpp-filen) –resultattyp klassnamn::funktionsnamn(parametrar) Kan även definieras i klassen om funktionen är väldigt kort (motsvarar inline)
h-filen #ifndef KLASSNAMN_H #define KLASSNAMN_H class Klassnamn { Klassnamn(); // Defaultkonstruktor Klassnamn(int p, int q); void Funktionsnamn(int p); }; #endif // KLASSNAMN_H
cpp-filen #include ”Klassnamn.h” Klassnamn::Klassnamn() { } Klassnamn::Klassnamn(int p, int q) {... } void Klassnamn::Funktionsnamn(int p) {... }
Initieringslistor (kap ) Hur skall medlemsobjekt vars konstruktor tar argument initieras? –Exempel: Size Initieringslistan har formen: –: d1(uttryck), d2(uttryck)... Klassnamn::Klassnamn(int width, int height) : m_size(width,height) {... }
Initieringslistor forts. Referenser kan bara initieras när de deklareras Hur skall referenser i klasser initieras? Member initializer list i konstruktorn Klassnamn::Klassnamn(Objekt & o) : m_referens(o) {... }
Övningar, exempel Konstruera en klass Person. En person skall bestå av: –Namn –Adress –Ålder –Föräldrar (Personer) Gör lämpliga metoder och konstruktorer
this-pekaren (kap. 8.2) I alla metoder finns en pekare som heter ”this” ”this” pekar ut det objekt som metoden arbetar på Via this-pekaren kommer man åt datamedlemmar
this forts. void Size::SetX(int x) { m_x = x; } void Size::SetX(int x) { this->m_x = x; } Dessa två metoder är ekvivalenta –Kompilatorn ”förstår” oftast när this-pekaren skall användas, därför behöver man oftast inte använda this-pekaren.
this forts. Metoder kan returnera this-objektet Kan användas för att länka ihop metodanrop Klass & Klass::metodnamn(parametrar) {... return *this; } Klass objekt; objekt.metod1(...).metod2(...).metod3(...);
Vänner (kap. 8.3) Tillåter viss extern åtkomst av protected och private medlemmar Bryter mot objektorienteringen Undvik så mycket som möjligt Dock nödvändig i vissa fall
Vänner forts. Vänner kan vara –Klasser –Funktioner Class C { friend returtyp funktion(parametrar); friend class C2;... };
Operatoröverlagring (kap. 8.4) Funktioner eller metoder som anropas genom aritmetiska tecken istället för metodnamn –Namn börjar med operatorX –X ersätts med +, -, =, !=, >, >, << m.fl. Kan snygga upp programkoden Ökar dock inte språkets uttrycksmöjligheter Syntaktiskt socker
Tilldelningsoperatorn Size & Size::operator=(Size const & s) { if(&s != this) { m_width = s.m_width; m_height = s.m_height; } return *this; } Size s1; Size s2; s1 = s2; // Tilldelningsoperatorn används // OBS skillnaden mot tilldelningskonstruktorn // Tilldelningsoperatorn används inte här Size s3 = s1;
Tilldelningsop. forts. if(&s != this) –Kopiera aldrig dig själv return *this; –Returnera objektet själv som resultat av tilldelningen
Operatorn += Liknar tilldelningsoperatorn i användningsätt Size & Size::operator+=(Size const & s) { m_width += s.m_width; m_height += s.m_height; return *this; } Size s1(10,5); Size s2(2,2); s1 += s2; // += operatorn används // s1 skall nu vara (12,7)
Operatorer Kan ha en operand (unära) eller två operander (binära) Operatorerna har samma prioritet som motsvarande fördefinierade operatorer Kan konstrueras som medlemsfunktioner eller vänfunktioner
Binära operatorer Har två operander –Den vänstra är objektet själv (this) –Den högra fås som första parameter Tar en parameter då det är en medlemsfunktion, två för vänfunktioner Exempel: ==, !=, +=, -=, +, -
Exempel (binär operator) Size s(10,10); Size t(5,5); Size u = s+t; // s+t skapar ett temporärt objekt // s är första operand, t andra // Detta är därför fullt möjligt int w = (s+t).Width(); // ger w = 15 Size Size::operator+(Size const & s) const { // this är första operand, s andra Size temp = *this; temp += s; // använd += operatorn return temp; // returnera temporärt objekt }
Unära operatorer Har en operand Tar oftast inga parametrar Exempel: ++, --, - Size Size::operator-() const { Size temp; temp.m_width = -m_width; temp.m_height = -m_height; return temp; }
Indexeringsoperatorn operator[] Används för indexering i t.ex. std::vector Standardbeteende är att lämna tillbaks en referens till ett element, så kan man både läsa och skriva till det indexerade elementet
Indexeringsoperatorn forts. Skapa också en ”const”-variant av de metoder som returnerar referenser till objekt int & Vektor::operator[](int index) {... return element; } int Vektor::operator[](int index) const {... return element; }
Övriga operatorer operator()(...); –Funktionsanropsoperator –Valfritt antal parametrar operator typ() const; –Inga parametrar eller returvärde anges –Omvandlar från den aktuella klassen till typen typ –Anropas automatiskt när typomvandling behövs
friend-operatorer Operatorer som inte passar i klasser Måste användas när vänsteroperanden inte tillhör den aktuella klassen Har lika många parametrar som antal operander friend returtyp operatorX(parametrar);
friend-operatorer forts. // friend-funktion ostream & operator<<(ostream & o, Size const& s) { o << s.m_width << ”,” << s.m_height; return o; } // Tillägg i Size-klassen friend ostream & operator<<(ostream & o, Size const& s); Size s(10,4); // skriv ut ”s har storleken 10,4.” cout << ”s har storleken ” << s << ”.” << endl;
Teknisk beskrivning av metodanrop i C++/C // C++ void Klass::metod() { m_variabel = 5; } /* C */ void Klass_metod(struct Klass * this) { this->m_variabel = 5; } instans.metod(); // Anrop till ”metod” Klass_metod(&instans); // Motsvarande C anrop
Objektorienterad analys (kap. 6.1) Analysfasen är till för att bestämma vad som skall göras –Sätt dig in i problemet –Skapa en grov modell av hur systemet skall vara uppbyggt Objekt Attribut Relationer
Klassdiagram Enkel beskrivning av klasser –Klassnamn –Dataattribut –Operatorer Person Namn Ålder Föräldrar GetName GetAge SetName …
Har-relation Aggregat Grafisk beskrivning av hur objekt är kopplade till varandra (har-relation) Bilen har en motor BilMotor
Har-relation forts. Bilen har en motor med flera cylindrar Fylld cirkel = en eller flera Ofylld cirkel = noll eller en MotorCylinder
Har-relation forts. Sammansättning av flera delobjekt Bil MotorHjulKaross
Känner till-relation Association Känner till objekt men ”äger” dem inte BilPerson ägerägare
Känner till-relation Association mellan objekt av samma klass Person make/maka
Är-relation Arv och ärvda egenskaper Gemensamma egenskaper med andra klasser Exempel –En bil är ett fordon –Motorcykel är ett fordon
Är-relation forts. Fordon Hastighet Vikt Ändra_hastighet Bil Motoreffekt Växla Båt Dödvikt Sväng Tåg Antal_vagnar Koppla_vagn
Objektorienterad design Designfasen är till för att bestämma hur saker skall lösas Ingen kristallklar gräns mellan analys och design
Systemdesign Beslut om vilka system som skall ingå –Windows / X-Windows –SQL-server –Tredjepartssystem
Objektdesign Konkretiserar de objekt som identifierades under analysfasen –Dataattribut –Metoder –Parametrar Algoritmer Programspråk
Modelleringsspråk OMT Objectory Booch UML (Unified Modeling Language) –OMT + Objectory –Industristandard –Modelleringshjälpmedel, inte någon metod