Att konstruera objekt
Konstruktorer
• När ett objekt instansieras anropas dess konstruktor
• Konstruktorn saknar returtyp
class A { public:
A(int x) {member = x;}
private:
int member;
}
• Konstruktorn utan argument kallas default-konstruktor.
• Även vanliga datatyper kan skapas så int x = int();
• Om man inte har skrivit någon konstruktor genereras kod för defaultkonstruktorn ändå
class A {
int member;
}
int foo() { A a;
}
• Konstruktorer kan överlagras
struct A {
A() {member = 0;}
A(int x) {member = x;}
…
• Man kan ange defaultparametrar
struct A {
A(int x = 0) {member = x;}
Initiering
• En konstruktors primära uppgift är att initiera medlemsvariabler
• Istället för tilldelning bör man använda initieringslistan
struct A {
A(int x) : member(x) {}
private:
int member;
}
• Vissa typer kan inte tilldelas, bara initieras struct A {
int & nr;
Big big;
A(int x) :nr(x), big(nr) {}
…
• Tilldelning är onödigt arbete om objektet istället kan initieras till rätt värde
• Tumregel, initiera alla medlemmar till 0
this-pekaren
• I en medlemsfunktion kan man komma åt objektet genom att använda den för-
definierade pekaren this
A & A::foo(A * neighbour) { if (this == neighbour)
cout << ”There is something strange in the neighbourhood”;
return *this;
}
Implicit konstruktor
• En implicit konstruktor tillhandahålls av kompilatorn ”vid behov” och kör
konstruktorn på alla objekt i klassen’
Vector v =alla_pensioner();
…
v = 3;
• Konstruktorer som tar ett argument kanske ska deklareras explicit. Tänk efter!
Konstruktionsordning
• Medlemmarna initieras i den ordning de är deklarerade.
struct A {
int weight;
int size;
A(int x) : size(foo(x)), weight(size)
{}
Destruktor
• En destruktor körs när ett objekt förstörs
– När en lokal variabel blir ”out of scope”
– Om man anropar delete på en pekare till objektet
– Om man anropar destruktorn direkt ~A()
• Låt destruktorn ta bort dynamiskt allokerat minne
~A() { delete minne; }
Privata konstruktorer
• Genom att deklarera konstruktorn privat kan man förhindra konstruktion utifrån.
• Istället kan man låta en metod konstruera instanser (factory)
• Man kan även låta destruktorn vara privat då förhindras allokering på stacken.
Sammanfattning
• Hur fungerar konstruktion och destruktion;
på stacken, på heapen, ordningsföljd
• Ni måste veta vad initieringslistan är och när man måste använda den
• Ni måste veta vad en implicit konstruktor är och hur och när man bör göra den
explicit