Presentation laddar. Vänta.

Presentation laddar. Vänta.

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.

Liknande presentationer


En presentation över ämnet: "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."— Presentationens avskrift:

1 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:

2 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

3 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.

4 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

5 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!

6 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å?

7 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!

8 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!

9 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

10 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. !

11 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?!?

12 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

13 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 ?

14 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();

15 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; }


Ladda ner ppt "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."

Liknande presentationer


Google-annonser