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
1234567class 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
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 argumentnavnet 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 medlemsinitialiseringslisten 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
Awesome!
Completion rate improved to 3.13
Konstruktørinitialiseringsliste
Stryg for at vise menuen
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
1234567class 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
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 argumentnavnet 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 medlemsinitialiseringslisten i en konstruktør?
Tak for dine kommentarer!