Функції#
Вступ#
Функції є фундаментальним компонентом програмування на C++, вони упаковують фрагменти коду в багаторазові, ефективні розділи коду, призначені для виконання певного завдання. Функції можна викликати кілька разів у програмі, що спрощує організацію коду та допомагає уникнути повторень коду. Функції також полегшують налагодження коду.
Ця сторінка охоплює основи використання функцій у C++, зокрема:
Структура та синтаксис функцій — Як функції записуються в C++, включаючи типи повернення, імена та параметри.
Прототипи функцій — Що таке прототипи функцій і чому вони використовуються.
Визначення та виклик функцій — Як створювати функції та викликати їх з вашої програми.
Повернуті значення — Як функції можуть надсилати дані назад викликаючій точці.
Передача за посиланням — Як функції можуть змінювати змінні поза межами їхньої власної області видимості.
Функції зворотного виклику — Як функції можна передавати в інші функції та викликати автоматично у відповідь на події.
Функції з аргументами за замовчуванням — Як параметрам можна надати значення за замовчуванням, якщо аргумент не надано.
Структура та синтаксис функцій#
У C++ функції мають бути оголошені з типом повернення, іменем та параметрами. Основний синтаксис такий:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
Функціональні частини |
Опис |
|---|---|
|
Тип даних, який повертає функція. Деякі поширені опції:
|
|
Назва функції. |
|
Необов’язково. Список типізованих параметрів, розділених комами, записаний як |
|
Необов’язково. Значення, що повертається функцією. Якщо |
Примітка: Функцію завжди потрібно оголошувати перед її викликом*, або ж необхідно надати прототип функції.
Прототипи функцій#
У C++ код читається зверху вниз. Це означає, що функція має бути відома компілятору, перш ніж її можна буде викликати.
Прототип функції дозволяє вам використовувати функцію до написання її повного коду. Це дозволяє вам зберігати main() ближче до початку програми, розміщуючи визначення функцій пізніше, де їх легше впорядкувати та читати.
Без прототипу вам довелося б визначати кожну функцію вище main(), що може ускладнити відстеження проектів у міру їх зростання.
// The function's prototype
void greeting();
int main() {
greeting();
}
// Write the function's body after
void greeting() {
Brain.Screen.print("Hello!");
}
Визначення та виклик функцій#
Functions with No Parameters#
Якщо функція не потребує вхідних даних, ви можете визначити її без параметрів. Використовуйте void як тип повернення, якщо функція не повертає значення.
// Define a function to display a message
void greeting() {
Brain.Screen.print("Hello!");
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Call the function to display the message
greeting();
}
Functions with Parameters#
Ви також можете додавати параметри до функцій, які дозволяють передавати інформацію для використання функцією.
Примітка: Текст можна передавати за допомогою рядків у стилі C (const char*) або рядків C++ (std::string).
// Define a function with a parameter
void namedGreeting(const char* name) {
Brain.Screen.print("Hello, %s!", name);
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
namedGreeting("Stranger");
}
Повернуті значення#
Функції можуть надсилати дані назад викликаючій платформі за допомогою ключового слова return Це дозволяє вам записувати та використовувати вивід у вашому проєкті.
// Define a function that multiplies numbers by 2
int timesTwo(int number) {
return number * 2;
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Display the return value
Brain.Screen.print("%d", timesTwo(2));
}
Передача за посиланням#
За замовчуванням C++ передає параметри функції за значенням, тобто функція отримує копію оригінальної змінної. Зміни, внесені всередині функції, не впливають на оригінальне значення.
// Add 1 to the number
void addOne(int number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will still be 5
}
Щоб дозволити функції змінювати оригінальну змінну, параметри можна передавати за посиланням, використовуючи символи &.
// Add 1 to the number
void addOne(int& number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will now be 6
}
Передача за посиланням дозволяє функціям оновлювати змінні, визначені поза функцією, не повертаючи значення.
Функції зворотного виклику#
Функція зворотного виклику — це функція, яка передається в іншу функцію та викликається автоматично, коли відбувається певна подія.
Зворотні виклики зазвичай використовуються для таких подій, як натискання кнопок або оновлення датчиків.
Замість того, щоб викликати функцію самостійно, проєкт викликає її за вас, коли відбувається подія.
void onPressed() {
Brain.Screen.print("Screen pressed!");
}
// Call onPressed whenever the screen is pressed
int main() {
vexcodeInit();
Brain.Screen.pressed(onPressed);
}
Callback Signatures#
Кожна функція зворотного виклику повинна відповідати певному підпису, який визначає:
Тип повернення
Кількість параметрів
Типи параметрів
Необхідний підпис визначається API. Функція зворотного виклику повинна точно відповідати цьому підпису.
// This callback function cannot include any parameters
void callback(void);
// This callback function includes four parameters
void callback(axisType axis, double x, double y, double z);
Назви параметрів є описовими та можуть відрізнятися, але тип повернення, порядок параметрів та типи параметрів повинні точно збігатися.
Функції з аргументами за замовчуванням#
Функції можуть визначати значення за замовчуванням для одного або кількох параметрів. Аргумент за замовчуванням використовується, коли під час виклику функції для цього параметра не надається значення.
Правила для аргументів за замовчуванням:
Аргументи за замовчуванням мають бути останніми параметрами у визначенні функції.
Щойно параметр має значення за замовчуванням, всі параметри після нього також повинні мати значення за замовчуванням.
Якщо функція визначає аргументи за замовчуванням у своєму prototype, ці значення за замовчуванням не повинні бути вказані знову у визначенні функції.
// Required parameter first, default parameter last
void greeting(const char* name, int repeatCount = 1) {
for (int i = 0; i < repeatCount; i++) {
Brain.Screen.print("Hello, %s!", name);
Brain.Screen.newLine();
}
}
int main() {
vexcodeInit();
// Say what name to greet (V5) and
// use default value for repeatCount (1)
greeting("V5");
Brain.Screen.newLine();
// Overrides the default value to 3
greeting("V5", 3);
}