Функції. Аргументи функції. Значення по замовчуванню

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

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

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

Створимо функцію яка буде приймати два аргументи (два цілі числа), виконає додавання з ними та виведе результат. Розглянемо чотири виклики даної функції:

не передаватимемо жодного аргументу. Оскільки функція очікуватиме два числа, то ми будемо мати помилку.

одне число. Функція очікує два аргументи, тому отримаємо помилку. Також помилку отримаємо, якщо передавати більше аргументів чим вказано у функції.

два цілі числа. Оскільки, функція очікує отримати два цілих числа, то все буде працювати добре.

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

    
            #include <iostream>
            void fun(int a, int b)
            {
                std::cout<<"a + b = " << a+b<< std::endl;
            }
            int main()
            {
                int number1, number2;
                std::cout << "input number:\n";
                std::cin >> number1;
                std::cout << "input number:\n";
                std::cin >> number2;

                //fun();  //помилка. не передали аргументи
                //fun(number1); //помилка. не достатньо аргументів

                fun(number1, number2); //все працює добре

                //fun(3.5, 7.1); //не коректна робота. передаємо не правильні типи
                //fun('3', 'c'); //не коректна робота. передаємо не правильні типи

                return 0;
            }
        
    

Дякуючи тому, що функції можуть мати різну кількість аргументів функції, а також можуть мати різні типи цих аргументів, то мова надає можливість «перенавантажувати» функції. Тобто, надавати різним функціям одне і теж ім’я але при цьому надавати їм різну кількість та тип аргументів.

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

    
            #include <iostream>
            void fun()
            {
                std::cout << "no argument\n";
                std::cout << "2 + 3 = " << 2+3 << std::endl;
            }
            void fun(int a, int b)
            {
                std::cout << "int\n";
                std::cout << "a + b = " << a+b << std::endl;
            }
            void fun(double a, double b)
            {
                std::cout << "double\n";
                std::cout << "a + b = " << a+b << std::endl;
            }

            int main()
            {
                //ми не передаємо аргументи, тому викликається перший варіант функції
                fun();

                //передаємо два цілі числа, тому викликається другий варіант функції
                fun(12, 32);

                //передаємо два числа з плаваючою крапкою, тому викликаємо третій варіант функції
                fun(4.7, 56.1);

                return 0;
            }
        
    

Часто бувають ситуації коли, ви використовуєте функцію в якої є аргументи але їх значення змінюється не часто, то в таких ситуаціях використовують значення за замовчуванням. Щоб створити аргумент зі значенням за замовленням, то необхідно після створення змінної вказати через дорівнює значення. Змінні які мають значення по замовчуванню мають знаходитися в кінці.

    
            #include <iostream>
            //будемо мати помилку, оскільки значення за замовченням не в кінці
            //void fun(int a = 5, int b)

            //значення за замовченням знаходиться в кінці. все добре
            void fun(int a, int b = 5)
            {
                std::cout << "a + b = " << a + b << std::endl;
            }

            int main()
            {
                //передаємо лише одне значення, а друге використовується за замовченням
                fun(2);

                //передаємо два значення, тому значення за замовченням не використовуємо
                fun(17, 23);

                return 0;
            }
        
    

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

    
            #include <iostream>
            void fun(int a = 3, int b = 5)
            {
                std::cout << "a + b = " << a + b << std::endl;
            }

            int main()
            {
                //не передаємо значення. тому "а = 3", "b = 5"
                fun();

                //передаємо лише одне значення. тому "а = 12", "b = 5"
                fun(12);

                //передаємо два значення, тому "a = 17", "b = 23"
                fun(17, 23);

                return 0;
            }
        
    

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

    
            #include <iostream>
            void fun(int a = 3, int b = 5)
            {
                std::cout << "a + b = " << a + b << std::endl;
            }
            void fun(int a)
            {
                std::cout << "2*a = " << 2*a << std::endl;
            }

            int main()
            {
                //програма не знає який варіант функції використовувати
                fun(12);
                return 0;
            }
        
    

Функція в якості аргументів може приймати не лише базові типи змінних а і для прикладу структуру.

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

Отже, щоб передати структуру в якості аргументу вам потрібно:

1) Створити дану структуру.

2) Вказати її в якості типу змінної яка буде аргументом функції.

3) При передачі змінної у функцію вказуємо лише її змінної яку передаємо).

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

        
            #include <iostream>

            //створюємо структуру з іменем "Cat"
            struct Cat
            {
                std::string name;
                int age;
            };

            //в якості аргумента функції ми використовуємо
            //змінну типу структура
            void fun(Cat kit)
            {
                //використовуємо значення з наашої структури
                std::cout << "name: " << kit.name << "\nage: " << kit.age << std::endl;
            }

            int main()
            {
                Cat cat;

                std::cout << "input name: ";
                std::cin >> cat.name;
                std::cout << "input age: ";
                std::cin >> cat.age;

                //передаємо у функцію структуру
                fun(cat);

                return 0;
            }