Kursinnehåll
C++ OOP
C++ OOP
Konstruktörinitialiseringslista
En initieringslista gör det möjligt för konstruktorer att initiera klassmedlemmar innan konstruktorns kropp körs. Detta är särskilt användbart för komplex initiering eller när man arbetar med objekt av klasser som har const
-medlemmar.
Syntax för initieringslista
Syntaxen för initieringslistor kan verka överdrivet komplex och förvirrande. Man kan överväga att endast använda en konstruktor som ett enklare alternativ. Men när programmet växer visar sig initieringslistor vara bekväma och enkla att använda.
:
(kolontecken): introducerar medlemsinitieringslistan i en konstruktor;medlem (värde): en klassmedlemsvariabel som initieras med värdet (argumentet som skickas till konstruktorn);
{ }
(klamrar): konstruktorns kropp, där ytterligare kod kan köras efter medlemsinitieringen.
temperature_sensor.h
class TemperatureSensor { public: TemperatureSensor(int initialTemperature) : currentTemperature(initialTemperature) {} int currentTemperature; };
Begränsningar och överväganden
Det finns en vanlig missuppfattning angående ordningen för initialisering i initialiseringslistan. Tvärtemot vad många tror, följer inte variablerna den ordning de skrivs i initialiseringslistan. Istället bestäms ordningen av medlemsdeklarationerna i klassen, inte av sekvensen i initialiseringslistan.
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; }
Försök att ändra ordningen för initialisering av variabeln total
i initialiseringslistan och i variabeldeklarationen inom class
.
När du använder initialiseringslistor i en konstruktor kan argumentnamnet vara detsamma som attributnamnet 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 om du använder samma namn för både medlemsvariablerna och argumenten, kommer total att ta värdet av de multiplicerade argumenten, inte medlemmarna. För att se detta, försök att sätta quantity till noll istället för argumentet.
1. Vad är en konstruktörs initialiseringslista?
2. Vilken symbol introducerar medlemsinitialiseringslistan i en konstruktör?
Tack för dina kommentarer!