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

Relevanta dokument
Synlighet. Namespace Scope-operatorn Klasser Vänner

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

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

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

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

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

Programsystemkonstruktion med C++

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

Dynamisk bindning och polymorfism

Kapitel 6 - Undantag

TDDC76 - Programmering och Datastrukturer

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

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

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

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

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

1 Namnkontroll (NameControl)

allokeras på stacken dynamiskt new delete

Tentamen i DD2387 Programsystemkonstruktion med C++

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

Klasshierarkier - repetition

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

TDDC76 - Programmering och Datastrukturer

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

TDDC76 Programmering och datastrukturer

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

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

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

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Introduktion till arv

Kapitel 4 - Mallar. Kapitel 4. Introduktion till mallar STL. 2D1387 Programsystemkonstruktion med C++ 1

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

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

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Problemet. Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism)

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

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Objektorienterad programmering Föreläsning 6. Mer om klasser och typer Namnrymder Inkapsling Synlighet Statiska variabler Statiska metoder

Det finns många flaggor till g++,

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

TDIU01 Programmering i C++

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

Kapitel 5. Strömmar. Utmatning

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

Tentamen EDAF30 Programmering i C++

Konstruktion av klasser med klasser

Tentamen *:85/2I4123 C

Innehåll. Pekare Exempel

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

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

5 Arv och dynamisk bindning FIGUR

Innehåll. Pekare Exempel

Arv. Objektorienterad och komponentbaserad programmering

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

Polymorfi. Objektorienterad och komponentbaserad programmering

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

F8: Typkonvertering i C++

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

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

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

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

1 Klasser och objektorientering Vad är objektorientering?

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

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

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

TDIU01 - Programmering i C++, grundkurs

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

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

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

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

Skapa, kopiera och destruera klassobjekt

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

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Objektorientering - Arv och polymorfi

Objektorienterad programmering

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

OOP Objekt-orienterad programmering

1 Funktioner och procedurell abstraktion

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

Föreläsning 5-7 Operatoröverlagring

C++-programmets beståndsdelar

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDIU01 - Programmering i C++, grundkurs

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

DAT043 - Föreläsning 7

Funktionens deklaration

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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

Tentamen i DD2387 Programsystemkonstruktion med C++

Transkript:

Kapitel 3 Klassanvändning Operatorer Pekare Kapitel 3 - Klassanvändning, operatorer och pekare Vänner till klasser och funktioner Virtuella funktioner och polymorfi Abstrakta basklasser och strikt virtuella funktioner 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 2 Namespace Scope-operatorn Klasser Vänner Ett problem med moduler i C är att alla variabel- och funktionsnamn ligger globalt synliga. C++ botar detta genom att införa det mycket användbara nyckelordet namespace I namnrymder kan man kapsla in klasser, funktioner och data Med synlighetsoperatorn (scope operator) :: kan man komma åt en namnrymd och medlemmar i klasser 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 4 2D1387 Programsystemkonstruktion med C++ 1

Med using exponerar man innehåll i en namnrymd Med odöpta namnrymder (unnamed namespaces) kan man deklarera data som endast är synliga i filen där de är definierade ObsoIet metod: I C (och därför även C++) skapar man filstatiska funktioner genom nyckelordet static Genom att ha fillokala data minskar risken för namnkonflikter namespace Spc // håll namnen på namnrymder korta class A; // framåt(forward)deklaration int foo(); enum arms = 2, legs = 1, hair = 517 class Spc::A // A är inte synlig utan Spc:: public : int foo(); inline int Spc::A::foo() return j; // använder Spc::A::j inline int Spc::foo() return j; // ok: Spc::j synlig 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 5 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 6 int main() if(spc::j > Spc::legs) // Använd Spc::j och /*...*/ // Spc::legs explicit using Spc::j; j = Spc::foo(); Spc::A a; j = a.foo(); // j synlig i hela main() // foo() ej synlig, använd Spc:: // Spc::A::foo() synlig genom a using Spc::A; // hela klassen A synlig using namespace Spc; // allt data i Spc synligt return 0; Några överkursexempel på namnrymder och using namespace XYZ_version1 void foo(); // deklaration namespace XYZ_version2 void foo(); // deklaration namespace XYZ = XYZ_version2; // alias för namnrymd void XYZ::foo() // definition av XYZ_ver2::foo // global variabel i // global variabel j // exempel på usingdeklaration (enstaka variabel) using XYZ::i; // lokal i, gömmer global i i = 3; // ok: lokal i // exempel på usingdirektiv (hel namnrymd) using namespace XYZ; // introducerar i, j och foo j = 4; // fel! ::j eller XYZ::j? 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 7 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 8 2D1387 Programsystemkonstruktion med C++ 2

Man kan byta synlighet på medlemmar med using struct A protected: struct B : public A using A::i; A a; B b; a.i = 1; b.i = 2; // fel: i är protected // ok och klasser För att komma åt data i klasser använder man synlighetsoperatorn :: Ett bra exempel på hur synlighetsoperatorn används är STLs iteratorer Iteratorerna är inkapslade i behållarklasserna och döpta till samma sak: T::iterator resp. T::const_iterator 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 9 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 10 och klasser Nedanstående exempel visar hur man kan använda klassens synlighetoperator för att abstrahera sin kod // här kan vi byta till lämpligare behållare vid behov // t.ex. std::vector eller std::deque typedef std::list<std::string> T; T t;... // oavsett klass, hämta dess const_iterator T::const_iterator i = t.begin(); for(; i!= t.end(); ++i) std::cout << *i << std::endl; 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 11 Vänner Ibland måste en klass ha tillgång till data i en annan Man vill dock inte använda åtkomsttypen public eftersom man får oönskad insyn Man specificerar sina vänner (klass eller funktion) med friend De får då åtkomstnivå public på data och funktioner friend-förhållandet ärvs inte friend bör undvikas för att inte äventyra inkapslingen 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 12 2D1387 Programsystemkonstruktion med C++ 3

Vänner class MyInt // i är private MyInt(int j) : i(j) friend const MyInt operator*(int, const MyInt &); friend std::ostream & operator<<(std::ostream &, const MyInt &); inline const MyInt operator*(int i, const MyInt &j) return MyInt(i * j.i); // kommer åt MyInt::i Konstanta referenser Returtyper Argumenttyper inline std::ostream & operator<<(std::ostream &s, const MyInt &j) s << "MyInt = " << j.i << ""; // kommer åt MyInt::i 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 13 Man kan omdefiniera operatorerna i C++ Detta gäller dock endast för egna typer såsom klasser, enums etc. Exempel på operatoröverlagring class MyInt const MyInt &operator=(const MyInt &); // tilldeln. const MyInt &operator+=(const MyInt &); // tilldeln. const MyInt operator+(int) const; // addition const MyInt operator+(const MyInt &) const;... MyInt i, j; i = j + 7; j += i; i.operator+=(j); // använd oper+() och oper=() // använd oper+=() // operatorer kan användas explicit 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 15 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 16 2D1387 Programsystemkonstruktion med C++ 4

Det är viktigt att tänka på returtyperna för operatorerna Ta addition som exempel: inget av de ingående objekten innehåller resultatet och därför måste en temporär skapas Tar man däremot prefix ++-operatorn så håller objektet själv rätt värde och kan returneras som referens Om returnerade referenser ska vara const är olika från fall till fall och beroende på klassens användningsområden (ta exempel heltalsklass): helst const i fallet (a = b) = c inte nödvändigtvis const om (rect = r).normalize() Är man osäker härmar man beteendet hos int Ytterligare exempel på operatoröverlagring class B; class A int operator()(int, double); // anropsoper B &operator[](int) const; // indexering B &operator[](const char *) const; // (i t.ex. map) const A operator++(int); // postfix inkr. const A &operator--(); // prefix dekr. const A operator*(const A &) const; // multiplikation A &operator*(); // avreferering const A operator*(int, const A &); // extern mult std::ostream &operator<<(std::ostream &, const A &); 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 17 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 18 Polymorfi Dynamisk bindning Virtuella funktioner Virtuella destruktorer Strikt virtuella funktioner Abstrakta basklasser Virtuella funktioner Normalt sett: kompilatorn vet vilken funktion som skall köras vid funktionsanrop - statisk bindning Virtuella funktioner: vilken funktion som körs bestäms av vilket objekt funktionen anropats genom - dynamisk bindning. Detta kallas polymorfi beteendet bestäms vid körningstillfället Polymorfi är endast applicerbart på pekare och referenser eftersom typen på ett objekt är känt vid kompileringstillfället. 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 20 2D1387 Programsystemkonstruktion med C++ 5

Virtuella funktioner struct A void print() std::cout << "A"; virtual void vprint() std::cout << "A"; struct B : public A void print() std::cout << "B"; virtual void vprint() std::cout << "B"; A a; B b; A *ap = &b; A &ar = b; ap->vprint(); ar.vprint(); ap->print(); ar.print(); b.vprint(); B *bp = &a; // ok: B är subklass till A // ok: ar refererar a // polymorfi: skriver ut "B" // polymorfi: skriver ut "B" // ej polymorfi: skriver ut "A" // ej polymorfi: skriver ut "A" // objekt: skriver ut "B" // fel: A är inte nedärvd från B Virtuella destruktorer För att alla objekt i en arvskedja skall få sina destruktorer anropade krävs att basklassen har en virtuell destruktor. class Av virtual ~Av(); class Bv : public Av ~Bv(); class A ~A(); class B : public A ~B(); B *bp = new B; A *ap = bp; delete ap; // fel?: B's destruktor anropas inte Bv *bvp = new Bv; Av *avp = bvp; delete avp; // ok: B's destruktor anropas 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 21 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 22 Abstrakta basklasser och strikt virtuella funktioner En strikt virtuell (pure virtual) funktion tvingar subklasser att ge en definition Basklassen kan då inte instantieras och kallas därför abstrakt basklass En abstrakt basklass definierar ett interface som alla nedärvda klasser måste följa Abstrakta basklasser och strikt virtuella funktioner class A virtual void print() = 0; // strikt pga '=0' class B : public A void print(); // definition måste ges om // B skall instantieras void B::print() std::cout << "B" << std::endl;... A a; // fel: A är en abstrakt basklass B b; // ok: B har alla funktioner definierade b.print(); // kör B::print(); 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 23 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 24 2D1387 Programsystemkonstruktion med C++ 6