Konstruktør Initialiseringsliste
Stryg for at vise menuen
En initialiseringsliste gør det muligt for konstruktører at initialisere klassemedlemmer før konstruktørens krop udføres. Dette er især nyttigt ved 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 medlems-initialiseringslisten i en konstruktør; -
medlem (værdi): en 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
1234567class TemperatureSensor { public: TemperatureSensor(int initialTemperature) : currentTemperature(initialTemperature) {} int currentTemperature; };
Begrænsninger og overvejelser
Der findes en udbredt misforståelse omkring 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
123456789101112131415#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 argumentets navn være det samme som attributnavnet i class.
main.cpp
123456789101112131415#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 medlems-initialiseringslisten i en konstruktør?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat