Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Konstruktor Ser till att objektets data är korrekt initierade MinKlass::MinKlass(); MinKlass::MinKlass(int length; char *name); ser ut som funktion utan returvärde Konstruktorns namn = klassens namn xy034pk a[ length: name:
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Standardkonstruktor (eng. Default constructor) används om inga parametrar ges har inga parametrar MinKlass::MinKlass(); eller har defaultvärden till alla parametrar MinKlass::MinKlass(int length = 5); Sen brukar det förstås finnas en eller flera andra konstruktorer med vardera en eller flera parametrar, beroende på vad som är naturligt för objekttypen
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Vad gör konstruktorn? Initierar medlemsdata till 0, false, tom sträng, etc... eller inparametrarnas värden. Sätter tillståndsmaskin-objekt i startläge. Flaggar explicit “detta är ett oinitierat objekt”, “listan är tom”, etc. Genererar en unik identitet till objekt som ska ha det. eller nåt annat som är vettigt för objekttypen.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT När exekveras konstruktorn? Då ett objekt deklareras: MinKlass mittObj; // Obs ingen parentes! /* jfr int myInt; samma form, analogt */ // Om konstruktorn är inline hamnar dess kod här. Då man skapar ett objekt med new: MinKlass *minObjP = new MinKlass(); // Konstruktorn exekveras inte om minnesallokeringen // misslyckas. Skapande av objekt-array är specialfall: defaultkonstruktorn körs en gång och sen kopieras resultatet till alla platser i arrayen
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Om det inte finns någon defaultkonstruktor MinKlass mittObj; mittObj:s datamedlemmar får typberoende “nollvärden” eller lämnas oinitierade. Kan vara OK...men Deklarara (default)konstruktor MinKlass() {/* kod */} så har Du koll på vad som händer!
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Finns det inget vettigt defaultvärde? Tvinga användaren att ange parametervärden genom att Bara deklarera konstruktorer med parametrar –Nackdel: om någon låter objekt av din klass ingå som delar i sin klass tvingas han/hon se till att “ditt” objekts konstruktor alltid anropas korrekt. –Kanske enklare göra en standardkonstruktor ändå?
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT initieringslista (member initialization list) MinKlass::MinKlass(int length; char *name) : _name(name), _length(length){/*kod*/} olle 3 _length: _name: class MinKlass {... int _length; string _name; } initierings- ordning! anrop av ingående delars konstruktorer Använd detta! God stil & förhindrar fel!
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Destruktor Städar upp! Frigör dynamiskt allokerat minne “ägt” av objektet Frigör andra resurser objektet använt –bilnummer –bankkontonummer –semafor ~Johnson() {/**/} oemottaglig för argument uträttar inget ger inget tillbaka är dessutom destruktiv!
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Kopieringskonstruktor (eng. Copy constructor) Bildata minSaab900(xxxxxx); Bildata dinNyaSaab900 (minSaab900); // “Default memberwise initialization” // Alla datamedlemmars innehåll kopieras // Helt tillåtet... men bilnumret? Bildata::Bildata(const Bildata & b) {/*kod*/} “Ändrar ej I den Bildata som kopieras” Måste inte vara const men brukar vara det
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Objekt som inte får kopieras? Förbjud kopiering genom att Deklarera men ej implementera kopieringskonstruktorn MinKlass(const MinKlass &m); // inte med i minklass.cpp Deklarera kopieringskonstruktorn som privat private: MinKlass (const MinKlass &m) {} Att förbjuda kopiering kan göra klassen svårhanterlig. !
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Vad sker vid tilldelning? objC = objA + objB; 1.ObjA får i uppdrag att utföra additionen. 2.ObjA skapar ett temporärt objekt och lägger resultatet i det. 3.ObjC får i uppdrag att byta sitt värde mot temporärobjektets. 4.Temporärobjektet försvinner. 5.Resultatet av hela satsen är en pekare till objC. Objektorientering när den är som konstigast?!?
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Tilldelningsoperator (eng. copy assignment operator) Bildata minSaab900(xxxxxx); Bildata dinNyaSaab900 = minbil; // “Default memberwise assignment” // Alla datamedlemmars innehåll kopieras // Helt tillåtet... men bilnumret? Bildata::operator=(const Bildata & b) {/*kod*/} Även denna kan göras private för att förhindra tilldelnings-kopiering
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT this-pekaren: behövs vid tilldelning return *this returnera objektet självt som resultat av tilldelningen if (this != &that) spara exekveringstid vid exv. “självtilldelning” a = b eller objekt a objekt b this objekt a = = objekt b this ?
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT this-pekaren forts return *this Kan även användas för att kedja ihop funktionsanrop screen.clear().moveCursor(2,2).setCursor(‘#’).display();
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT this-pekaren i tilldelningsoperatorn Bildata::operator=(const Bildata & b) { if (this != b) // objektet ska inte kopiera sej självt till sej självt! { // kopieringsjobbet } return *this; }