Kursusindhold
C++ OOP
C++ OOP
Konstruktørinitialiseringsliste
En initialiseringsliste gør det muligt for konstruktører at initialisere klassemedlemmer før konstruktørens krop udføres. Det er især nyttigt til kompleks initialisering eller når der arbejdes med objekter af klasser, der har const
medlemmer.
Syntaks for initialiseringsliste
Syntaksen for initialiseringslister kan virke unødigt kompleks og forvirrende. Man kunne overveje kun at bruge en konstruktør som et enklere alternativ. Men efterhånden som programmet vokser, viser initialiseringslister sig at være praktiske og nemme at anvende.
:
(kolon-symbol): introducerer medlemsinitialiseringslisten i en konstruktør;medlem (værdi): et klassemedlemsvariabel, der initialiseres med værdien (argumentet, der gives til konstruktøren);
{ }
(krøllede parenteser): konstruktørens krop, hvor yderligere kode kan udføres efter medlemsinitialisering.
temperature_sensor.h
class TemperatureSensor { public: TemperatureSensor(int initialTemperature) : currentTemperature(initialTemperature) {} int currentTemperature; };
Begrænsninger og overvejelser
Der findes en udbredt misforståelse vedrørende rækkefølgen af initialisering i initialiseringslisten. Modsat hvad mange tror, følger initialiseringen af variabler i initialiseringslisten ikke den rækkefølge, de er skrevet i. I stedet bestemmes rækkefølgen af medlemsdeklarationerne i klassen, ikke af rækkefølgen i initialiseringslisten.
main.cpp
#include <iostream> class Exchanger { public: Exchanger(float _quantity, float _rate) : quantity(_quantity), rate(_rate), total(quantity * rate) {} float quantity, rate, total; }; int main() { Exchanger exchanger(100, 0.3); std::cout << exchanger.total; }
Prøv at ændre rækkefølgen for initialisering af variablen total
i initialiseringslisten og i variabeldeklarationen inden for class
.
Når du bruger initialiseringslister i en konstruktør, kan argumentnavnet være det samme som attributnavnet i class
.
main.cpp
#include <iostream> class Exchanger { public: Exchanger(float quantity, float rate) : quantity(quantity), rate(rate), total(quantity * rate) {} float quantity, rate, total; }; int main() { Exchanger exchanger(100, 0.3); std::cout << exchanger.total; }
Men hvis du bruger det samme navn til både medlemsvariablerne og argumenterne, vil total få værdien af de multiplicerede argumenter, ikke medlemmerne. For at se dette, prøv at sætte quantity til nul i stedet for argumentet.
1. Hvad er en konstruktør-initialiseringsliste?
2. Hvilket symbol introducerer medlemsinitialiseringslisten i en konstruktør?
Tak for dine kommentarer!