1 / 15

Konstruktor

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

fifi
Télécharger la présentation

Konstruktor

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

More Related