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

Relevanta dokument
Klasser. Klassen String funktionalitet. Klassen String funktionalitet, forts. Klassen String funktionalitet, forts. Vad ska man kunna göra?

Klasser. Konstruktion av en enskild, icke-trivial klass

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

Skapa, kopiera och destruera klassobjekt

Operatoröverlagring. 1 Definition och deklaration av operatorfunktioner. 2 Anrop av operatorfunktioner

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

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

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

TDDC76 - Programmering och Datastrukturer

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

TDDC76 - Programmering och Datastrukturer

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

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

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

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

Trädtraversering. Binärt träd. Trädtraversering djupet-först. Trädtraversering bredden-först

TDIU01 Programmering i C++

Generiska konstruktioner. Kursbokens kapitel 13

TDIU01 - Programmering i C++, grundkurs

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

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

C++ Objektorientering - Klasser. Eric Elfving

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

TDDC76 PoD OH Föreläsning C Klasser

Klassmedlemmar. Klasser. Konstruktion av en enskild, icke-trivial klass. Klassen String funktionalitet

Föreläsning 5-7 Operatoröverlagring

TDDC76 PoD OH Föreläsning C Härledda klasser

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

TDDC76 - Programmering och Datastrukturer

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

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

Tillämpad programmering

Programsystemkonstruktion med C++

TDDC76 Programmering och datastrukturer

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

Dynamisk bindning och polymorfism

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

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

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

TDDC76 - Programmering och Datastrukturer

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

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

Tentamen EDAF30 Programmering i C++

Innehåll. Pekare Exempel

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

Laboration 3. Kalkylator för aritmetiska uttryck. Kalkylatorn ska kunna läsa antingen enbokstavskommandon eller infixuttryck. Exempel på infixuttryck:

Innehåll. Pekare Exempel

Kommentarer till Person

Kapitel 6 - Undantag

Kalkylator för aritmetiska uttryck

allokeras på stacken dynamiskt new delete

Tommy Färnqvist, IDA, Linköpings universitet

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

Tillämpad programmering

Kopiering av objekt i Java

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

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

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Exempelvis pekarvariabler blir då lättare korrekt deklarerade och initierade.

Del6 Strömmar Ämnesområden denna föreläsning:

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

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

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

1 Namnkontroll (NameControl)

Programmering B med Visual C

Introduktion till arv

3. Minneshantering - (copy)konstruktorn, destruktorn och tilldelningsoperatorn

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

Objektorienterad programmering Föreläsning 5

Kalkylator för aritmetiska uttryck

C++-programmets beståndsdelar

1 Klasser och objektorientering Vad är objektorientering?

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

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

Innehåll. Relationer mellan klasser Operatoröverlagring. Static-medlemmar. Const- och referensmedlemmar. Const medlemsfunktioner

C++ - En introduktion

TDIU01 - Programmering i C++, grundkurs

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

Objektorienterad programmering Föreläsning 4

Kapitel 5. Strömmar. Utmatning

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

Programmering A. Johan Eliasson

TDIU01 - Programmering i C++, grundkurs

TDDC76 - Programmering och Datastrukturer

DAT043 - Föreläsning 7

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TDDI14 Objektorienterad programmering

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

TDIU01 - Programmering i C++, grundkurs

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

TDDC76 - Programmering och Datastrukturer

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

TDDC76 - Programmering och Datastrukturer

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:

Transkript:

TDDC76 PoD OH Föreläsning C++ 83 Operatoröverlagring endast operatorsymboler definierade i C++ kan överlagras + - * / % ^ & ~! << >> = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && ++ -- -> ->*, [ ] ( ) new new[] delete delete[] fyra operatorer är inte tillåtna att överlagra..* ::?: de tre första är fundamentala för åtkomst och deklaration av klassmedlemmar?: har en strikt ordning för beräkning av argumenten som inte kan specificeras för en egen överlagring fyra operatorer måste vara en icke-statisk medlemsfunktion = () [] -> säkerställer att vänsteroperanden är ett objekt av typen ifråga övriga kan antingen vara en icke-statisk medlemsfunktion med ingen parameter (unär operator) eller en parameter (binär operator) this finns implicit icke-medlemsfunktion med en parameter (unär operator) eller två parametrar (binär operator)

TDDC76 PoD OH Föreläsning C++ 84 Operatoröverlagring, forts. anropssyntaxen kan väljas som vanligt för operatorer (infix-, prefix- eller postfix-notation) a + b om medlem vanligt medlemsfunktionsanrop a.operator+(b) om icke-medlem vanligt funktionsanrop operator+(a, b) prioritet och associativitet gäller enligt de inbyggda operatorerna beräkningsordningen för argument kan inte styras medför problem vid överlagring av exempelvis && och överlagra inte sådana operatorer (HIC++ 13.2.1) välj parametertyper och resultattyp med omsorg se till att returtypen för en binär operator matchar dess inbyggda motsvarighet (HIC++ 13.2.2) deklarera binära aritmetiska operatorer och bitvisa operatorer som icke-medlemmar (HIC++ 13.2.3) tänk på att icke-medlemsfunktioner ska deklareras i samma namnrymd som typen de tillhör (String i detta fall) ADL (Argument Dependent Lookup) kan annars ställa till det funktionen hittas inte eller, i värsta fall, väljs fel funktion

TDDC76 PoD OH Föreläsning C++ 85 Indexeringsoperator operator[] gör ingen kontroll av indexvärdet ska alltid implementeras med en icke-const- och en const-version (HIC++ 13.2.4) char& String::operator[](int pos) return p_[pos]; char String::operator[](int pos) const return p_[pos]; // för icke-const String // för const String motsvarande medlemsfunktion at() kontrollerar om given position (index) är tillåten om inte kastas undantaget out_of_range char& String::at(int pos) if (pos < 0 pos >= size_) throw out_of_range"string::at()"; return p_[pos]; char String::at(int pos) const if (pos < 0 pos >= size_) throw out_of_range"string::at()"; return p_[pos]; // för icke-const String // för const String

TDDC76 PoD OH Föreläsning C++ 86 Strängsammansättning s1 += s2; s3 = s1 + s2: sammansättning av två String-objekt med += String& String::operator+=(const String& rhs) if (!rhs.empty()) append_(rhs.p_); return *this; sammansättning av två String-objekt med + String operator+(const String& lhs, const String& lhs) return String lhs.operator+=(rhs); operatorer som + och += hör ihop finns den ena förväntas den andra också finnas operator+ implementeras med hjälp av operator+= (HIC++ 13.2.5) säkerställer konsekvent semantik för += och + exempel på när man använder vanlig medlemsfunktionsanropssyntax för operatorfunktion

TDDC76 PoD OH Föreläsning C++ 87 Utskrift med operator<< String s"foobar"; cout << s << endl; operator<< kan inte vara medlem vänster operand är ostream, inte String standardbibliotekets operator<< för const char* kan användas för att implementera i och med att den publika medlemsfunktionen c_str() finns behöver operator<< inte vara friend ostream& operator<<(ostream& os, const String& str) return os << str.c_str();

TDDC76 PoD OH Föreläsning C++ 88 Friend eller inte? En vanlig operatorfunktion kan vara vän, friend. class String public: friend bool operator==(const String& lhs, const String& rhs); ; bool operator==(const String& lhs, const String& rhs); Undvik om möjligt. vänskap är den starkaste formen av koppling man kan åstadkomma till en klass. ger tillgång till alla delar av klassen, även privata arv ger inte tillgång till klassens privata delar vänskap går att undvika om det finns publika medlemsfunktioner som kan användas: bool operator==(const String& lhs, const String& rhs) return strcmp(lhs.c_str(), rhs.c_str()) == 0;

TDDC76 PoD OH Föreläsning C++ 89 Överlagrade varianter Varianter för jämförelse med char*: bool operator==(const String& lhs, const String& rhs); bool operator==(const String& lhs, const char* rhs); bool operator==(const char* lhs, const String& rhs); Detta tillåter följande jämförelser utan typomvandling (och därmed att temporära objekt skapas): String s1"foo"; String s2"fie"; char s3[] = "fum"; s1 == s2 s2 == s3 s3 == s1

TDDC76 PoD OH Föreläsning C++ 90 Operatoröverlagring riktlinjer (se även HIC++ 13.2) om operatorn är en av följande kan den inte överlagras..* :: :? om operatorn är en av följande måste den vara medlem = -> [] () om operatorn 1. kan ha en annan typ som vänsterargument, eller den 2. kan ha typomvandling för sitt vänsterargument, eller den 3. kan implementeras enbart med publika medlemsfunktioner, gör den till icke-medlem och, om nödvändigt i fall 1 och 2, även friend om implementeringen kräver åtkomst till icke-publika medlemmar om operatorn behöver bete sig virtuellt, lägg till en virtuell medlemsfunktion och låt operatorn anropa den medlemsfunktionen (av intresse i samband med polymorfa klasser) i annat fall, låt operatorn vara medlem det finns dock fler operatorer som det vanligtvis är naturligt att (vänster)operanden ska vara ett objekt av typen ifråga: *= /= %= += -= &= = ^= <<= >>= ++ -- överlagra inte operatorer med speciell semantik, dvs &&, och, (kommaoperatorn) (HIC++ 13.2.1) samtliga vänsterassociativa, högeroperanden till && och ska enbart beräknas om vänsteroperanden beräknats true/false överlagring av adressoperatorn & kan leda till odefinierat beteende om den används på ställe där den egna inte är synlig

TDDC76 PoD OH Föreläsning C++ 91 Sammanfattning Vi har studerat en icke-trivial klass och i samband med den tagit upp ett antal viktiga saker. initiering konstruktorer av olika slag defaultkonstruktor kopieringskonstruktor och flyttkonstruktor andra konstruktorer, bland annat typomvandlande destruering String-objekt i sig återtas automatiskt då deklarationsblocket lämnas eller delete utförs på ett dynamiskt String-objekt det tillhörande dynamiska minnet måste uttryckligen återlämnas delete[] p_ tilldelning kopieringstilldelning och flyttilldelning andra tilldelningar, bland annat typomvandlande olika operationer överlagrade operatorer och vanliga funktioner medlem eller icke-medlem? swap-funktioner är mycket användbara för containerliknande klasser mycket viktigt att deklarera medlemsfunktioner som inte ändrar på datamedlemmar const (HIC++ 9.1.1) alltid viktigt att använda const för saker som inte ska ändras objekt, medlemsfunktioner, parametrar, iteratorer visade sig enkelt i detta fall (char*)

TDDC76 PoD OH Föreläsning C++ 92 Sammanfattning, forts. vi har lyckats undvika att vän-deklarera (friend) icke-medlemmar (HIC++ 11.2) publika medlemsfunktioner som ändå ska finnas används typomvandling tillåts under kontrollerade former behovet av implicit typomvandling har minimerats tumregeln säger annars att det bör elimineras vissa binära operatorer har överlagrats i versioner som kan ta String och char* blandat förekomsten av temporära objekt minimeras implicit typomvandling från char* till String tillåts får anses problemfri och användbart endast explicit typomvandling till char* tillåts (HIC++ 12.1.1) eftersom det är en pekartyp skulle annars mycket kunna hända in- och utmatning funktionalitet och implementation i analogi med inbyggda datatyper undantagssäker programmering genomtänkt kodning i situationer då undantag kan kastas inga objekt blir defekta inget minne läcker användbart idiom skapa en temporär och byt (HIC++ 12.5.6) uppsättningen operationer behöver utvidgas för att få en användbar strängtyp