Список Ініціалізації Конструктора
Список ініціалізації дозволяє конструкторам ініціалізувати члени класу до виконання тіла конструктора. Це особливо корисно для складної ініціалізації або при роботі з об'єктами класів, які мають const-члени.
Синтаксис списку ініціалізації
Синтаксис списків ініціалізації може здаватися надто складним і заплутаним. Можна розглядати використання лише конструктора як простішу альтернативу. Однак із розширенням програми списки ініціалізації виявляються зручними та простими у використанні.
-
:(дво крапка): вводить список ініціалізації членів у конструкторі; -
member (value): змінна-член класу, яка ініціалізується значенням (аргумент, переданий у конструктор);
-
{ }(фігурні дужки): тіло конструктора, де після ініціалізації членів можна виконати додатковий код.
temperature_sensor.h
1234567class TemperatureSensor { public: TemperatureSensor(int initialTemperature) : currentTemperature(initialTemperature) {} int currentTemperature; };
Обмеження та особливості
Існує поширене хибне уявлення щодо порядку ініціалізації в списку ініціалізації. На відміну від загальної думки, ініціалізація змінних у списку ініціалізації не відбувається у тому порядку, в якому вони записані. Насправді, порядок визначається порядком оголошення членів у класі, а не послідовністю у списку ініціалізації.
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; }
Спробуйте змінити порядок ініціалізації змінної total у списку ініціалізації та при оголошенні змінної в межах class.
Під час використання списків ініціалізації в конструкторі, ім'я аргументу може збігатися з ім'ям атрибута у 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; }
Але якщо ви використовуєте однакові імена для змінних-членів і аргументів, total отримає значення перемножених аргументів, а не членів. Щоб переконатися в цьому, спробуйте встановити quantity у нуль замість аргументу.
1. Що таке список ініціалізації конструктора?
2. Який символ вводить список ініціалізації членів у конструкторі?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 3.13
Список Ініціалізації Конструктора
Свайпніть щоб показати меню
Список ініціалізації дозволяє конструкторам ініціалізувати члени класу до виконання тіла конструктора. Це особливо корисно для складної ініціалізації або при роботі з об'єктами класів, які мають const-члени.
Синтаксис списку ініціалізації
Синтаксис списків ініціалізації може здаватися надто складним і заплутаним. Можна розглядати використання лише конструктора як простішу альтернативу. Однак із розширенням програми списки ініціалізації виявляються зручними та простими у використанні.
-
:(дво крапка): вводить список ініціалізації членів у конструкторі; -
member (value): змінна-член класу, яка ініціалізується значенням (аргумент, переданий у конструктор);
-
{ }(фігурні дужки): тіло конструктора, де після ініціалізації членів можна виконати додатковий код.
temperature_sensor.h
1234567class TemperatureSensor { public: TemperatureSensor(int initialTemperature) : currentTemperature(initialTemperature) {} int currentTemperature; };
Обмеження та особливості
Існує поширене хибне уявлення щодо порядку ініціалізації в списку ініціалізації. На відміну від загальної думки, ініціалізація змінних у списку ініціалізації не відбувається у тому порядку, в якому вони записані. Насправді, порядок визначається порядком оголошення членів у класі, а не послідовністю у списку ініціалізації.
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; }
Спробуйте змінити порядок ініціалізації змінної total у списку ініціалізації та при оголошенні змінної в межах class.
Під час використання списків ініціалізації в конструкторі, ім'я аргументу може збігатися з ім'ям атрибута у 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; }
Але якщо ви використовуєте однакові імена для змінних-членів і аргументів, total отримає значення перемножених аргументів, а не членів. Щоб переконатися в цьому, спробуйте встановити quantity у нуль замість аргументу.
1. Що таке список ініціалізації конструктора?
2. Який символ вводить список ініціалізації членів у конструкторі?
Дякуємо за ваш відгук!