Nashbar Skrevet 18. september 2009 Del Skrevet 18. september 2009 (endret) 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 18. september 2009 av Hr_Pengesekk Lenke til kommentar
GeirGrusom Skrevet 18. september 2009 Del Skrevet 18. september 2009 Feil bruk av super-constructorer (eller hva det enn heter) i andre setning Lenke til kommentar
Giddion Skrevet 18. september 2009 Del Skrevet 18. september 2009 Nei, du skriver ikke det samme, i den første koden gjør du det du vil, men i den andre koden (hvis jeg ikke tar helt feil) setter du ikke navn osv... til parent constructor, men lager en instance av human. Lenke til kommentar
Kagee Skrevet 19. september 2009 Del Skrevet 19. september 2009 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
Nashbar Skrevet 19. september 2009 Forfatter Del Skrevet 19. september 2009 takker =) Lenke til kommentar
Dead_Rabbit Skrevet 19. september 2009 Del Skrevet 19. september 2009 (endret) 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 ) 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 19. september 2009 av Dead_Rabbit Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå