Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av operatorer 134 += = 3 + 4i fördefinierade datatyper (ej klasser):kompilatorn vet vad operatorerna betyder 1 + 2i2 + 3i += ??? + Klass-objekt som vi designar: kompilatorn har ingen aning
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 2 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av operatorer forts För klasser vi tillverkar bestämmer vi vilka operatorer som ska tillåtas och vad de betyder De bör betyda något som användaren lätt förstår + = ? += Bil::operator+ List::operator+
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 3 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av operatorer forts Det är språkets fördefinierade operatorer vi kan överlagra –inte riktigt alla men nästan, se boken s 745 Vi kan inte ändra deras precedensordning Vi kan inte ändra antalet operander de tar Vi kan inte heller definiera nya operatorer för de fördefinierade datatyperna i språket
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 4 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT operator+ Överlagring av operatorer exempel List::operator+(const List &andraListan) { List sjalv_kopia, kompis_kopia, resultat; sjalv _kopia = kopiera (theList); //privat hjälprutin kompis_kopia = kopiera(andraListan.theList); resultat = konkatenera(sjalv _kopia, kompis_kopia); return resultatet; } tabell överlagringsbara operatorer i boken s 745 Det är faktiskt skiftoperatorer man skriver ut resp läser in med theList += newList = myList + otherList; List myList
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 5 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av operatorer forts Det är helt OK att ha olika typer till operatorn: + = List::operator+(Elem &e); + = Elem::operator+(List&l); Naturlig Listan vet vad element är Mindre naturlig Vet element- klassen vad en lista är?
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 6 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Kom ihåg: Objektet självt (*this) är den vänstra operanden mittObj + annatObj undantag: unära operatorer -mittObj
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 7 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Friends (vänner) Box::omskriv(const Cirkel &); Linje::diagonal(const Box&); cout << mylist; class Cirkel { // etc private: // positionsdata etc. };
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 8 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Friends (vänner) forts class Cirkel { friend class Box; // etc private: // positionsdata etc. }; en friend har access till klassens privata saker class Box { friend void Linje::diagonal(const Box &); // etc. };
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 9 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Friends (vänner) forts friend kan vara en annan klass “vanlig” funktion en medlemsfunktion i en annan klass Vanligaste användningen är operatorer om vänstra operanden inte är “vår klass”
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 10 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT "Användardefinierad typkonvertering" (User-defined conversions) Minklass::operator int() { // Kod som utför konverteringen } typ man konverterar till Kompilatorn kan komma att använda konverteringsfunktionen implicit, dvs utan att man kodat ett anrop. För att förhindra det: explicit operator int() En konstruktor med en enda inparameter är faktiskt också en konverteringsfunktion
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 11 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Sammanfattning av olika slags medlemsfunktioner konstruktor* destruktor copy-konstruktor copy assignment operator andra operatorer konverteringsfunktioner (till annan typ än MinKlass) “vanliga” medlemsfunktioner MinKlass ~MinKlass MinKlass(const MinKlass&) MinKlass & operator= operator+ operator int() doSomething(xxx) *konstruktor med en parameter är också konverteringsfunktion
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 12 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Funktionsmall template void myfunc(Type * arr, int n) { // kod; // objekt av typ Type kan deklareras och // användas inom funktionen } Implicit instansiering, Type byts mot aktuell typ
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 13 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Klassmall template class Stack { Stack(); ~Stack(); void push(const Type item); void pop(Type &item); } instansiering görs explicit enligt: Stack my_stack; Type byts mot aktuell typ
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 14 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Klassmall forts Medlemsfunktioner definierade i.cpp-filen måste också göras som mallar: template Stack ::push const Type item) // OBS! { // kod } Type byts mot aktuell typ
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 15 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Abstrakta Containertyper Vilka finns och vad kan dom? Principer för att bygga en sån? Detta strykes om det ej hinns med!