Konstruktor

15
2000-period2 CD5250 OOP med C++ Mats Medin MDH/IDT Sid 1 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:

description

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). - PowerPoint PPT Presentation

Transcript of Konstruktor

Page 1: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 1

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[

-32877length:

name:

Page 2: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 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

Page 3: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

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

Page 4: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 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

Page 5: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 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)konstruktorMinKlass() {/* kod */}

så har Du koll på vad som händer!

Page 6: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

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

Page 7: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 7

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åendedelars konstruktorer

Använd detta!God stil & förhindrar fel!

Page 8: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 8

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!

Page 9: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 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

Page 10: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 10

Objekt som inte får kopieras?Förbjud kopiering genom att• Deklarera men ej implementera

kopieringskonstruktornMinKlass(const MinKlass &m); // inte med i minklass.cpp

• Deklarera kopieringskonstruktorn som privatprivate: MinKlass (const MinKlass &m) {}

Att förbjudakopiering kangöra klassensvårhanterlig.

!

Page 11: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 11

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

Page 12: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 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

Page 13: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 13

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 bthis objekt a = = objekt bthis?

Page 14: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

Sid 14

this-pekaren forts return *this

Kan även användas för att kedja ihop funktionsanrop

screen.clear().moveCursor(2,2).setCursor(‘#’).display();

Page 15: Konstruktor

2000-period2 CD5250 OOP med C++Mats Medin MDH/IDT

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