Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avViktoria Mattsson
1
Sid 1 2000-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[ -32877 length: name:
2
Sid 2 2000-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
3
Sid 3 2000-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.
4
Sid 4 2000-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
5
Sid 5 2000-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!
6
Sid 6 2000-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å?
7
Sid 7 2000-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!
8
Sid 8 2000-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!
9
Sid 9 2000-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
10
Sid 10 2000-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. !
11
Sid 11 2000-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?!?
12
Sid 12 2000-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
13
Sid 13 2000-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 ?
14
Sid 14 2000-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();
15
Sid 15 2000-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; }
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.