150 likes | 355 Views
length:. -32877. name:. xy034pk a[. 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. Standardkonstruktor (eng. Default constructor).
E N D
length: -32877 name: xy034pk a[ 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 CD5250 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 CD5250 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. CD5250 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 CD5250 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! CD5250 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å? CD5250 OOP med C++ Mats Medin MDH/IDT
_length: 3 _name: olle initieringslista(member initialization list) class MinKlass { ... int _length; string _name; } MinKlass::MinKlass(int length; char *name) : _name(name), _length(length){/*kod*/} initierings- ordning! Använd detta! God stil & förhindrar fel! anrop av ingående delars konstruktorer CD5250 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 • oemottaglig för argument • uträttar inget • ger inget tillbaka • är dessutom destruktiv! ~Johnson() {/**/} CD5250 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 CD5250 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. CD5250 OOP med C++ Mats Medin MDH/IDT
Objektorientering när den är som konstigast?!? Vad sker vid tilldelning? objC = objA + objB; • ObjA får i uppdrag att utföra additionen. • ObjA skapar ett temporärt objekt och lägger resultatet i det. • ObjC får i uppdrag att byta sitt värde mot temporärobjektets. • Temporärobjektet försvinner. • Resultatet av hela satsen är en pekare till objC. CD5250 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 CD5250 OOP med C++ Mats Medin MDH/IDT
this this objekt a objekt b objekt a = = objekt b 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 CD5250 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(); CD5250 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; } CD5250 OOP med C++ Mats Medin MDH/IDT