Список ініціалізації в конструкторі класу

З попереднього уроку ми вже знаємо, що змінні класу ми можемо ініціалізувати (присвоювати їм значення) як при створенні так і за допомогою конструктора класу.

Коли ми надавали значення змінним за допомогою конструктора, то створювали його немов функцію.

При цьому можна використовувати ще альтернативний варіант ініціалізації змінних класу. Для цього ми можемо скористатися списком ініціалізації.

Щоб зробити список ініціалізації потрібно скористатися правилом:

1. Вказати ім’я класу (відбувається створення конструктора).

2. Ставимо круглі дужки. При потребі дужках створюємо змінні (аргументи).

3. Ставимо символ « : ».

4. Записуємо змінні класу, які хочемо ініціалізувати.

5. Ініціалізуємо змінні записуючи після них в круглих дужках значення.

6. Ставимо фігурні дужки і при потребі записуємо дії конструктора.


Розглянемо як це виглядатиме на практиці:

    
            #include <iostream>

            class Dog{
                int Age;
                std::string Name;

            public:
                //Конструктор який надає значення змінним за замовчуванням
                //за допомогою списку ініціалізації
                Dog() : Age(3), Name("Gav")
                {}

                //Конструктор в який ми можемо передавати параметри
                //для ініціалізації змінних класу
                //При потребі також, можна надавати значення за замовчуванням
                Dog(int _Age, std::string _Name = "Bobuk") : Age(_Age), Name(_Name)
                {}

                void Display()
                {
                    std::cout << "Name = " << Name << "\nAge = " << Age << std::endl;
                }
            };

            int main()
            {
                Dog dog1;
                dog1.Display();

                Dog dog2(7, "Bosui");
                dog2.Display();

                return 0;
            }
        
    

При цьому варто зауважити, що при використанні списку ініціалізації змінні ініціалізуються не в порядку списку, а в порядку їх оголошення (створення) в класі.

        
            #include <iostream>

            class A {
                //зверніть свою увагу на порядок створення змінних класу
                int a;
                int b;
                int c;

            public:
                //В даному випадку порядок списку ініфіалізації не збігається
                //з порядком створення змінних, тому змінна "b" матиме
                //в якості значення якесь сміття
                //Тому, що вона оголошена перед змінною "с", а ініціалізована після
                A(int _a) : a(_a), c(a + 10), b(c*2)
                {}

                //в даному випадку ми ініціалізуємо значення за допомогою
                //методу копіювання в конструкторі.
                //Тому, всі змінні матимуть значення, які й очікувалися
                //A(int _a)
                //{
                //	a = _a;
                //	c = a + 10;
                //	b = c * 2;
                //}

                void fun()
                {
                    std::cout << "a = " << a << "\nb = " << b << "\nc = " << c << std::endl;
                }
            };

            int main()
            {
                A a(2);
                a.fun();

                return 0;
            }
        
    

Отже, використовуючи список ініціалізації вам варто ініціалізовувати змінні в такому ж порядку як вони оголошені.