Клас. Створення конструкторів та деструктора

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

В класах для цих задач використовують

Конструктор ми можемо описати як метод класу, що викликається автоматично при створені екземпляру класу. Вказувати тип конструктора не потрібно, тобто ми не пишемо і так далі як у звичайних функціях. конструктора завжди має збігатися з класу. При цьому конструктор нічого не повертає, тому в ньому не має бути Конструкторів у класі може бути довільна кількість, але якщо їх буде декілька, то вони мають відрізнятися кількістю змінних У фігурних дужках можна написати всі дії які мають виконатися при створені класу. Ці дії виконуються автоматично. Оскільки конструктор виконує дії автоматично при створені екземпляру класу, то його варто робити публічним.

Це виглядатиме так:

    
        Ім’я_класу(аргументи_конструктора)
        {
            Дії_які_має_виконати_конструктор;
        }
    

Наприклад:

    
        #include <iostream>

        class Dog
        {
            //робимо конструктор публічним щоб він міг
            //використатися за межами класу
            public:
            Dog()
            {
                //дії які виконуватимуться при виклику конструктора
                std::cout << "It`s constructor";
            }
        };

        int main()
        {
            //створюємо екземпляр класу.
            //зауважте, жодних методів ми не викликаємо
            Dog dog;

            return 0;
        }
    

Якщо ваш конструктор не має аргументів і дій які має виконувати (цей пункт не то його називають «конструктором по замовчуванню». У випадках, коли, ви не створили жодного конструктора або не має підходящого, то програма використовує його. Зауважимо, що коли ви створили декілька конструкторів, то конструктор по замовчуванню варто створити самостійно.

Наприклад:

    
        class Dog
        {
            std::string _name;
            public:

            //це є конструктор по замовчуванню
            Dog()
            {

            }

            //це є конструктор з параметром/аргументом
            Dog(std::string name)
            {
                _name = name;
            }
        };
    

За допомогою різних конструкторів ми можете ініціалізовувати різні змінні при створені екземпляру класу.

Для того щоб ініціалізувати змінні при створенні екземпляру класу вам необхідно в круглих дужках записати значення які будуть надаватися змінним. Якщо, програма знайде підходящий конструктор, то виконає його.


        Ім’я_класу ім’я_змінної_типу_клас(значення);
        

Наприклад:

    
        #include <iostream>

        class Dog
        {
            std::string _name;

            public:

            //це є конструктор по замовчуванню
            Dog()
            {
                //надаємо значення по замовчуванню для
                //демонстрації виконання роботи конструктором по замовчуванню
                _name = "Kit";
            }

            //це є конструктор з параметром/аргументом
            Dog(std::string name)
            {
                //значення яке ми передаємо/вказуємо при створенні
                //екземпляру класу передається у змінну "_name"
                _name = name;
            }

            void display()
            {
                std::cout << "name: " << _name << std::endl;
            }
        };

        int main()
        {
            //ми не передаємо жодних значень, тому використовується
            //конструктор за замовчуванням
            Dog dog;
            dog.display();

            //Передаємо параметр, тому програма використає відповідний конструктор
            Dog dog2("<(^.^)>");
            dog2.display();

            return 0;
        }
    

Ось вам зразок коду в якому програма самостійно обирає який конструктор їй використовувати:

    
        #include <iostream>

        class Dog
        {
            std::string _name;
            int age;

            public:

            //це є конструктор по замовчуванню
            Dog()
            {
                //надаємо значення по замовчуванню для
                //демонстрації виконання роботи конструктором по замовчуванню
                _name = "Kit";
                age = 3;
            }

            //це є конструктор з параметром/аргументом
            //зверніть увагу. тут ми отримуємо змінну типу "string"
            //в якості параметра
            Dog(std::string name)
            {
                //значення яке ми передаємо/вказуємо при створенні
                //екземпляру класу передається у змінну "_name"
                //а змінна "age" отримує значення автоматично
                _name = name;
                age = 7;
            }

            //в цьому ж конструкторі ми маємо змінну типу "int"
            //в якості параметра
            Dog(int a)
            {
                age = a;
                _name = "Pesuk";
            }

            void display()
            {
                std::cout << "name: " << _name << std::endl << "age: " << age << std::endl;
            }
        };

        int main()
        {
            //ми не передаємо жодних значень, тому використовується
            //конструктор за замовчуванням (перший)
            Dog dog;
            dog.display();

            //Передаємо параметр, тому програма використає відповідний конструктор
            //враховуючи, що ми передаємо змінну типу "string", то програма
            //використає другий конструктор
            Dog dog2("<(^.^)>");
            dog2.display();

            //передаємо в якості параметру число (int), тому програма
            //буде  використовувати третій конструктор
            Dog dog3(5);
            dog3.display();

            return 0;
        }
    

Деструктор це протилежність конструктора. Якщо конструктор викликається при створені екземпляру класу, то деструктор викликається при його знищені.

Деструктор вивільняє виділену на екземпляр класу. Тобто, даний екземпляр буде видаленим.

Деструктор також має бути публічним щоб ви змогли його викликати у програмі.

Щоб створити деструктор вам варто:

1. Поставити символ

2. Написати класу.

3. Поставити круглі, а потім фігурні дужки.

4. Не забуваємо про крапку з комою

Скорочений запис буде таким:


        ~Ім’я_класу() {};
        

Наприклад:

    
            //створюємо деструктор
            ~Dog() {};
        
    

Так це виглядатиме в класі:

    
            class Dog
            {
                std::string _name;
                int age;

                public:

                Dog()
                {
                    _name = "Kit";
                    age = 3;
                }

                void display()
                {
                    std::cout << "name: " << _name << std::endl << "age: " << age << std::endl;
                }

                //створюємо деструктор
                ~Dog() {};
            };
        

Деструктор можна використовувати/викликати як звичайний метод класу:

    
            int main()
            {
                Dog dog;
                dog.display();

                dog.~Dog();

                return 0;
            }