Gå til innhold

trenger hjelp med arv og konstruktører


Anbefalte innlegg

jeg har en simpel klasse som heter human, og en annen klasse som heter student (arver fra human og har i tillegg int ecs).

human har "navn" og alder som setter med en konstruktør.

jeg vil sette student sitt navn og alder med konstruktør også.

 

 

så godtfolk, forklar meg hvorfor denne studentkonstruktøren virker:

 

student::student(std::string name, int age, int ec) : human(name, age), ects(ec)

{}

 

 

mens denne ikke ikke greier å sette name og age riktig?:

 

student::student(std::string name, int age, int ec){

human(name, age)

ects = ec;

}

 

 

er det ikke bare to måter å skrive nøyaktig det samme på?

Endret av Hr_Pengesekk
Lenke til kommentar
Videoannonse
Annonse

student::student(std::string name, int age, int ec) : human(name, age), ects(ec) {}

Her construerer du et objekt av klassen student, og setter navn og alder via constructoren til parent. Deretter setter du studentvariabelen ects.

 

student::student(std::string name, int age, int ec){
human(name, age)
ects = ec;
}

Her construerer du et objekt av klassen student, deretter kalles nullconstrucroren til human automatisk.Deretter lager du et anonymt humanobjekt INNE I dette studentobjectet (du kobler det ikke til en variabel, dvs det kan ikke brukes og det har ingenting med parent til dette objektet å gjøre) Deretter setter du ects inne i constructoren.

 

student::student(std::string name, int age, int ec) :human(name, age) {
ects = ec;
}

Her skjer så godt som det samme i eksempel 1.

Lenke til kommentar

Når et objekt initialiseres skjer det i en bestemt rekkefølge. Det første som skjer er at base-klasser bli initialisert. Så blir medlemmer initialisert og så kjøres konstruktøren. En initialization list (som du bruker i første eksempelet, altså den dritten mellom kolonet og hakeparantesen) kan initialisere medlemmer og base-klasser. Hvis en initialization list ikke spesifiseres, vil base-klassen og medlemmene bli konstruert ved at standardkonstruktøren (fornorsking av default constructor :w00t: ) blir kalt.

 

I første eksempelet så initialiserer du base-klassen human og medlemmet ects. Det er greit. I andre eksempelet prøver du å initialisere base-klassen i konstruktøren. Base-klassen er allerede initialisert pga. "order of initialization" som nevnte ovenfor. Det gir derfor heller ikke mening hvis man ser på det fra kompilatorens synspunkt.

 

Forresten, når det gjelder initialiseringslister. I det første eksempelet ditt initialiserer du ects i initialiseringslista di. Dette betyr at med en gang ects konstrueres, så blir den initialisert med ec. I den andre koden så konstrueres og initialiseres ects først, for deretter at verdien av ec blir kopiert til ects. Derfor er det mer effektivt å bruke initialiseringslister der det er mulig siden man sparer en unødvendig kopiering.

Endret av Dead_Rabbit
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...