Konstruktor
description
Transcript of 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:
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
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.
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
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!
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å?
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!
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!
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
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.
!
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?!?
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
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?
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();
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;}