Клас. Створення та реалізація методів

Ми вже знаємо, що в середині можна створювати і навіть реалізовувати функції. Такі функції називаються методами класу.

Дані методи і варто сприймати як звичайні функції. Розглянемо наступний приклад:

    
        #include <iostream>

        class CLASS
        {
            public:

            //функція яка нічого не приймає і нічого не повертає
            void f1()
            {
                std::cout << "Hello!" << std::endl;
            }

            //функція яка нічого не приймає але повертає
            int f2()
            {
                return 7;
            }

            //функція яка приймає але нічого не повертає
            void f3(int a, int b)
            {
                std::cout << "a*b = " << a * b << std::endl;
            }

            //функція яка і приймає і повертає
            int f4(int a, int b)
            {
                return a + b;
            }
        };

        int main()
        {
            CLASS cl;

            cl.f1();
            std::cout << "number f2: " << cl.f2() << std::endl;
            cl.f3(3, 5);
            std::cout << "number f3: " << cl.f4(2, 21) << std::endl;

            return 0;
        }
    

Як бачите методи дійсно є звичайними функціями.

Єдине варто пам’ятати, для того щоб скористатися методами класу вам необхідно щоб вони були з публічним доступом.

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

    
        #include <iostream>

        class CLASS
        {
            int _a, _b;
            public:

            //отримуємо значення змінної в якості параметра функції
            void f1(int a)
            {
                _a = a;
            }

            //значення змінної отримуємо в середині функції
            void f2()
            {
                std::cout << "input number: " << std::endl;
                std::cin >> _b;
            }

            //виводимо значення змінних
            void f3()
            {
                std::cout << "a = " << _a << "\nb = " << _b << std::endl;
            }
        };

        int main()
        {
            CLASS cl;

            cl.f1(5);
            cl.f2();
            cl.f3();

            return 0;
        }
    

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

Звісно, для реалізації методу за межами класу не буде грати роль його модифікатор доступу. Але, само собою, приватні методи ви не зможете використовувати за межами класу.

Для того щоб оголосити метод класу в середині класу вам необхідно:

1. Вказати тип методу.

2. Вказати ім’я методу.

3. В круглих дужках вказати аргументи методу, якщо вони є.

Далі, щоб реалізувати даний метод вам необхідно:

1. Вказати тип методу.

2. Вказати ім’я класу якому належить даний метод та поставити Це є аналогічно до простору імен

3. Вказати ім’я методу.

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

5. У фігурних дужках написати реалізацію методу.

Реалізація методу має знаходитися після його оголошення.

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

    
            #include <iostream>

            class CLASS
            {
                public:

                //оголошуємо метод класу
                //зверніть увагу, ми вказуємо тип метода
                //його ім'я та аргументи
                //фігурних дужок та реалізації в класі не має
                void display(int a);
            };

            //по факту ми повторюємо оголошення методу
            //але, перед ім'ям методу ми вказуємо ім'я класу
            //якому належить даний метод.
            //далі ставимо двічі двокрапку "::", а вже тоді,
            //вказуємо ім'я методу та його аргументи.
            //після чого, у фігурних дужках йде його реалізація

            void CLASS::display(int a)
            {
                std::cout << "2 * " << a << " = " << 2 * a << std::endl;
            }

            int main()
            {
                CLASS cl;

                cl.display(7);

                return 0;
            }
        

Крім методів класу, ви також можете реалізовувати конструктор та деструктор за його межами. Логіка їх реалізації нічим не відрізняється від реалізації методів. Єдине, ми не вказуємо їх тип.

    
            #include <iostream>

            class CLASS
            {
            public:

                //оголошуємо конструктор класу
                //вказуємо його ім'я та аргументи
                //фігурних дужок та реалізації в класі не має
                CLASS();

                //оголошуємо деструктор
                ~CLASS();
            };

            //оскільки для конструктора тип не вказується,
            //то відповідно його не має
            CLASS::CLASS()
            {
                std::cout << "It`s C.." << std::endl;
            }

            CLASS::~CLASS() {};

            int main()
            {
                CLASS cl;

                return 0;
            }
        

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

Наприклад:

        
            #include <iostream>

            //створимо два класи та оголосимо в них однаковий метод
            //після чого реалізуємо їх за межами класів

            class CLASS
            {
                public:

                void fun(int a, int b);
            };

            //в першому класі метод буде додавати числа
            void CLASS::fun(int a, int b)
            {
                std::cout << a << " + " << b << " = " << a + b << std::endl;
            }


            class CLASS2
            {
                public:

                void fun(int a, int b);
            };

            //в другому класі метод буде множити числа
            void CLASS2::fun(int a, int b)
            {
                std::cout << a << " * " << b << " = " << a * b << std::endl;
            }

            //реалізація звичайної функції яка має ті ж тип, ім'я та аргументи
            void fun(int a, int b)
            {
                std::cout << a << " - " << b << " = " << a - b << std::endl;
            }

            int main()
            {
                CLASS cl;
                cl.fun(3, 7);

                CLASS2 cl2;
                cl2.fun(3, 7);

                fun(3, 7);

                return 0;
            }